C++递归类型特征
C++ recursive type traits
>我正在尝试实现一个模板类(此处命名为Get<>
),给定一个结构H
,如果限定 id H::der
不存在,则类型 Get<H>::type
是H
本身,否则Get<H::der>::type
。我不明白以下代码有什么问题:
#include <iostream>
#include <typeinfo>
using namespace std;
template<class U, class V = void>
struct Get
{
static const char id = 'A';
typedef U type;
};
template<class U>
struct Get<U,typename U::der>
{
static const char id = 'B';
typedef typename Get<typename U::der>::type type;
};
struct H1
{ };
struct H2
{ typedef double der; };
struct H3
{ typedef void der; };
struct H4
{ typedef H2 der; };
void print(char id, const char* name)
{
cout << id << ", " << name << endl;
}
int main(int , char *[])
{
print(Get<H1>::id, typeid(Get<H1>::type).name()); // prints "A, 2H1", OK
print(Get<H2>::id, typeid(Get<H2>::type).name()); // prints "A, 2H2", why?
print(Get<H3>::id, typeid(Get<H3>::type).name()); // prints "B, v" , OK
print(Get<H4>::id, typeid(Get<H4>::type).name()); // prints "A, 2H4", why?
}
我需要一些帮助来使这段代码按预期运行。更具体地说,我希望Get< H2 >::type
等于double
,Get< H4 >::type
也是如此。
模板Get<>
有一个默认的模板参数 - 这是非常危险的。 根据V
是否等于int
,void
或double
你会得到不同的结果。这是发生的情况:
Get<H2>::type
首先Get<H2, void>
(id='A'
)。现在检查一下,它是否有专业化。你的B是Get<U,typename U::der>
,它变成了Get<U, double>
。但这不符合Get<H2, void>
,所以选择了A
。事情变得有趣Get<H2>::type
.然后变体 B 也Get<U, void>
并提供更好的匹配。 但是,该方法不适用于所有类型。
这就是我将如何实现Get
:
template<class U>
class Get
{
template <typename T, typename = typename T::der>
static typename Get<typename T::der>::type test(int);
template <typename T>
static T test(...);
public:
typedef decltype(test<U>(0)) type;
};
<</div>
div class="answers"> 虽然我给@ipc答案一个+1,并且对于启用C++11的编译器来说非常好,但对于C++03编译器,您应该使用不同的方法,因为C++03不支持函数模板参数的默认值。所以我有这个代码:
template<class U, class V = void>
struct Get
{
static const char id = 'A';
typedef U type;
};
template< class T >
struct is_type {
static const bool value = true;
};
template<class U>
struct Get<U,
typename std::tr1::enable_if<is_type<typename U::der>::value, void>::type>
{
static const char id = 'B';
typedef typename Get<typename U::der>::type type;
};
相关文章:
- 如何将高维数据映射到特征类型?
- 将平面阵列重塑为复杂的特征类型
- 以特征类型作为参数的泛型函数回调
- 如何通过opencv中的程序参数定义特征类型?
- 在编译时检查特征类型保存的数据在内存中是否连续
- 专门针对特征类型的功能
- 具有特征类型输出的特征二进制 Expr
- 使用具有STL容器和STD :: vector的特征类型
- 从指针进行特征3类型的强制转换/复制(溢出uint8_t)
- 使用 python 扩展在 gdb 中打印特征类型时出现问题
- 将特征类型与 boost::bind 一起使用是否会自动违反 Eigen 的"only pass by reference"规则?
- NVIDIA NVCC 在使用模板特征类型时更改编译时间常量
- 固定大小的特征类型作为参数
- 特征类型类型定义失败,并显示 C4430
- 检查类型是否为特征 3 类型
- 传递std::迭代器,指向具有特征类型的向量
- visual studio 2012中对特征类型向量的自动矢量化表现不佳
- 子类特征类型
- 使用一个特征类型内提升图
- 特征c++类型转换