Lui*_*uca 6 c++ templates nested traits
在C++中看到许多元编程的例子,它们可以找出类的属性(例如知道类型是否是模板的特化),或者知道类是否包含给定的嵌套类型; 但我想知道是否有可能编写一个测试或特征来确定最后一个的倒数 - 检查一个给定Type是否嵌套在一个class或struct.
换句话说,我正在寻找以下伪代码的等价物:
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++解决方案,但在第一种情况下,如果它是向后移植的话,我会更欢迎它.
您所要求的是不可能的,但不是由于技术限制,而是因为您不能总是判断类型名称是否标识嵌套类型 - 并且模板使用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
| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |