C++ - 知道类型/类是否嵌套?

Lui*_*uca 6 c++ templates nested traits

在C++中看到许多元编程的例子,它们可以找出类的属性(例如知道类型是否是模板的特化),或者知道类是否包含给定的嵌套类型; 但我想知道是否有可能编写一个测试或特征来确定最后一个的倒数 - 检查一个给定Type是否嵌套在一个classstruct.

换句话说,我正在寻找以下伪代码的等价物:

template <typename Type> struct is_nested {
    enum { value = {__some magic__} };
};

typedef int type1;
struct Something { typedef int internal_type; };
typedef Something::internal_type type2;

//...later, likely at a different scope

is_nested< int >::value; // yields false
is_nested< std::vector<int>::iterator >::value; // yields true
is_nested< type1 >::value; // yields false
is_nested< type2 >::value; // yields true
Run Code Online (Sandbox Code Playgroud)

我知道我可以sizeof用来实现是/否测试,我认为Type是那些测试的一部分,但我无法弄清楚如何在测试中插入某种"任何可行的类型",这样我就可以形成一个表达式喜欢Anytype::Type.

template 
struct is_nested
{
    typedef char yes;
    typedef struct { char u[2]; } no;

    // Herein lies the problem
    ???? static yes test( char [ sizeof(Anytype::Type) ] ) ;
    ???? static no test(...);


public:
    enum { value = sizeof(test(0)) == sizeof(char) };
};

(请注意,我不关心,也不(能负担得起)知道什么类型会Type被嵌套在,所有它的问题是,如果它是嵌套在一些或不换句话说,这一特点应该.只有依靠Type.)

我正在寻找C++ 11或C++ 03中的C++解决方案,但在第一种情况下,如果它是向后移植的话,我会更欢迎它.

And*_*owl 1

您所要求的是不可能的,但不是由于技术限制,而是因为您不能总是判断类型名称是否标识嵌套类型 - 并且模板使用types,而不是名称。

在这种情况下,例如:

is_nested< std::vector<int>::iterator >::value
Run Code Online (Sandbox Code Playgroud)

你不知道那iterator是什么。考虑这个类my_vector

template<typename T>
struct my_vector
{
    typedef T* iterator;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

应该is_nested<my_vector<int>::iterator>::value产生什么?您可能期望结果是true

然而,这里嵌套的是别名而不是类型本身:类型int*不是嵌套的。事实上,我希望您希望得到以下结果false

is_nested<int*>::value
Run Code Online (Sandbox Code Playgroud)

因此,对于相同的类型(在本例中为 ),相同的is_nested<T>特征应该产生两个不同的结果。无法从类型本身检索应定义的信息- 并且模板使用类型,而不是名称。Tint*is_nested<>valueT