сравнение типов

Есть ли способ сравнить результат decltypeв С++ 11?

Другими словами, почему этот код недействителен:

template<typename T, typename U>
void func(T& t, U& u) {
    if(decltype(t) == decltype(u)) {
        // Some optimised version for this case
    } else {
        // A more general case for differing types
    }
}

Я знаю, что в некоторых случаях эту конкретную проблему можно решить путем частичной специализации шаблонов; мой вопрос касается сравнения decltypeс.

Изменить:Вопрос возник в ходе попытки предоставить значения по умолчанию для бесплатных функций через SFINAE. Возможно, лучше было бы спросить, почему это недействительно:

template<bool B>
bool SomeFunction() {... }

template<typename T, typename U>
bool SomeFunctionWrapper(T& t, U& u) {
    SomeFunction<decltype(t) == decltype(u)>();
}

С тех пор я нашел другое решение (, которое вообще не использует шаблоны ), но на одном этапе я попробовал это:

// If it exists, the free function is defined as
// bool AFreeFunction();
typedef struct { char } undefined;
template<typename T = void>
undefined AFreeFunction();

template<bool B>
bool AFreeFunctionWrapper_() {
    return false;
}

template<>
bool AFreeFunctionWrapper_<false>() {
    return AFreeFunction();
}

bool AFreeFunctionWrapper() {
    return AFreeFunctionWrapper_<decltype(AFreeFunction()) == decltype(undefined)>();
}

В конце концов я получил вариант этой стратегии, работающий с GCC 4.6, но затем обнаружил, что аргументы шаблона по умолчанию не разрешены для функций шаблона в MSVC даже в RC 2012. Таким образом, окончательное решение выглядит следующим образом:

class AFreeFunction {
public:
    operator bool() { return false; }
};

Если функция определена, она вызывается. Если это не так, он вместо этого интерпретируется как конструктор класса, который затем неявно приводится к bool.

5
задан Tom 8 August 2012 в 16:32
поделиться