Я хочу проверить, имеет ли аргумент шаблона ссылочный тип или нет в C ++ 03. (У нас уже есть is_reference
в C ++ 11 и Boost).
Я использовал SFINAE и тот факт, что у нас не может быть указателя на ссылку.
Вот мое решение
#include <iostream>
template<typename T>
class IsReference {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(C*);
template<typename C> static Two test(...);
public:
enum { val = sizeof(IsReference<T>::template test<T>(0)) == 1 };
enum { result = !val };
};
int main()
{
std::cout<< IsReference<int&>::result; // outputs 1
std::cout<< IsReference<int>::result; // outputs 0
}
Есть какие-то конкретные проблемы с этим? Кто-нибудь может предложить мне лучшее решение?