Есть ли способ сравнить результат 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
.