Я пытаюсь определить пользовательские типы типов (к которым я отношусь сравнительно недавно), которые проверяют, поддерживает ли заданный тип определенную операцию. Если у меня есть только один тип, он работает так, как предполагалось, но если я поместил две черты типа последовательно, они оба будут вести себя как один (когда я использую второй, он возвращает тот же результат, что и первый). Я использую Visual Studio 2015 (v140).Последовательные настройки пользовательского типа, которые ведут себя как один
Пример кода:
#include <type_traits>
template<typename T, typename = void>
struct is_comparable_by_equal_to
: std::false_type {};
template<typename T>
struct is_comparable_by_equal_to<T, typename std::enable_if<true,
decltype(std::declval<T>() == std::declval<T>(), (void)0)>::type>
: std::true_type {};
template<typename T, typename = void>
struct is_comparable_by_not_equal_to
: std::false_type {};
template<typename T>
struct is_comparable_by_not_equal_to<T, typename std::enable_if<true,
decltype(std::declval<T>() != std::declval<T>(), (void)0)>::type>
: std::true_type {};
class mClass {
public:
bool operator== (const mClass& obj) {
return false;
}
};
int main() {
printf("%s: %d\n", "is_comparable_by_equal_to",
is_comparable_by_equal_to<mClass>::value);
printf("%s: %d\n", "is_comparable_by_not_equal_to",
is_comparable_by_not_equal_to<mClass>::value);
}
Результирующий выход:
is_comparable_by_equal_to: 1
is_comparable_by_not_equal_to: 1
Предназначенный Выходной результат:
is_comparable_by_equal_to: 1
is_comparable_by_not_equal_to: 0
Вопрос почему и как решить эту проблему? Кроме того, я открыт для улучшения, как определить такие свойства пользовательского типа.
Если я скомпилирую ваш код с помощью 'g ++ -std = C++ 11 traits.cpp' (или C++ 14), я получаю предполагаемый результат. – rom1v
VS компилятор '19.10.24903.0' дает ожидаемый результат, попробуйте здесь: http://webcompiler.cloudapp.net/ –
Предложенный результат с помощью clang ++ (3.5) и g ++ (4.9.2) – max66