模板特化中,如何针对未定义的类型进行识别,与特化?
本帖最后由 laybor 于 2013-08-23 01:40:17 编辑 如题。
template<typename T>
struct node_t;
template<>
struct node_t<char>
{
enum {
value = 1,
};
};
namespace priv
{
template<typename T>
struct node_t
{
enum {
value = 2,
};
};
template <typename T>
struct get_t
{
enum {
value = node_t<T>::value
};
};
};
struct unknown_type{};
template<typename T>
struct node_t;
template<>
struct node_t<char>
{
enum {
value = 1,
};
};
namespace priv
{
template<typename T>
struct xnode_t : node_t<T>{};
template xnode_t<char>;
}
namespace priv
{
template<typename T>
struct node_t
{
enum {
value = 2,
};
};
template <typename T>
struct get_t : xnode_t<T>
{
};
};
没有特化的话,就用 priv::node_t<T>;
同时要保持 ::node_t 对于没有特化的类型为 incomplete type,引发编译错误。
template<typename T> struct node_t;
template <> struct node_t<char> { enum { value = 1 }; };
namespace priv
{
template<typename T>
class is_global_node_t
{
typedef char one;
typedef struct { char arr[2]; } two;
template<typename U>
static decltype(::node_t<U>::value, one()) test(int);
template<typename> static two test (...);
public:
static constexpr bool value = sizeof(test<T>(0)) == 1;
};
template <typename T>
struct node_t { enum { value = 2 }; };
template <typename T, bool = is_global_node_t<T>::value>
struct get_t : ::node_t<T> { };
template <typename T>
struct get_t<T,false> : node_t<T> { };
};
struct unknown_type { };
// open the following will print 3.
// template <> struct node_t<unknown_type> { enum { value = 3 }; };
#include <iostream>
int main ()
{
std::cout << priv::get_t<char>::value << std::endl; // 1
std::cout << priv::get_t<unknown_type>::value << std::endl; // 2
}