我想在C ++ 03中检查模板参数是否属于引用类型。 (我们在C ++ 11和Boost中已经有is_reference
。
我使用了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
}
有什么特别的问题吗?任何人都可以为我提供更好的解决方案吗?
答案 0 :(得分:15)
你可以更轻松地做到这一点:
template <typename T> struct IsRef {
static bool const result = false;
};
template <typename T> struct IsRef<T&> {
static bool const result = true;
};
答案 1 :(得分:7)
多年前,我写过:
//! compile-time boolean type
template< bool b >
struct bool_ {
enum { result = b!=0 };
typedef bool_ result_t;
};
template< typename T >
struct is_reference : bool_<false> {};
template< typename T >
struct is_reference<T&> : bool_<true> {};
对我来说,这似乎比你的解决方案简单。
但是,它只使用了几次,可能会丢失一些东西。