2017-01-21 2 views
0

Я пытаюсь определить пользовательские типы типов (к которым я отношусь сравнительно недавно), которые проверяют, поддерживает ли заданный тип определенную операцию. Если у меня есть только один тип, он работает так, как предполагалось, но если я поместил две черты типа последовательно, они оба будут вести себя как один (когда я использую второй, он возвращает тот же результат, что и первый). Я использую 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

Вопрос почему и как решить эту проблему? Кроме того, я открыт для улучшения, как определить такие свойства пользовательского типа.

+0

Если я скомпилирую ваш код с помощью 'g ++ -std = C++ 11 traits.cpp' (или C++ 14), я получаю предполагаемый результат. – rom1v

+0

VS компилятор '19.10.24903.0' дает ожидаемый результат, попробуйте здесь: http://webcompiler.cloudapp.net/ –

+0

Предложенный результат с помощью clang ++ (3.5) и g ++ (4.9.2) – max66

ответ

0

Я скомпилировал код с g ++ -std = C++ 11, и он работал по назначению.

Как оказалось, проблема заключалась в версии компилятора Visual Studio 2015 (обновление VS2015 2), когда я обновлялся до последней версии (обновление 3), она работала по назначению.

Смежные вопросы