当前位置:  开发笔记 > 编程语言 > 正文

提取C++模板参数

如何解决《提取C++模板参数》经验,为你挑选了2个好方法。

虽然我很怀疑,但我很好奇是否有可能从现有类型中提取原始类型模板参数,可能使用RTTI.

例如:

typedef std::bitset<16> WordSet;

是否可以在上面的代码中提取数字16,而无需在其他地方进行硬编码?编译器特定的实现是受欢迎的,虽然我特别感兴趣g++.



1> Johannes Sch..:

这是不可能的.通常的做法是:

template
struct foo {
    static const int value = N;
};

和类型

template
struct foo {
    typedef T type;
};

您可以将其作为foo<39>::value或访问foo::type.

如果您有特定类型,则可以使用部分模板专业化:

template
struct steal_it;

template
struct steal_it< std::bitset > {
    static const std::size_t value = N;
};

实际上,类型参数也可以使用相同的原理.现在你可以传递任何bitset,比如steal_it< std::bitset<16> >::value(注意使用size_t,而不是int!).因为我们还没有可变参数的许多模板参数,所以我们必须将自己限制为特定的参数计数,并重复steal_it模板特化以计数从1到N.另一个难点是扫描具有混合参数的类型(类型和非类型参数).这可能是非常重要的解决方案.

如果你没有类型,但只有它的一个对象,你可以使用一个技巧,在编译时仍然得到一个值:

template
char (& getN(T const &) )[steal_it::value];  

int main() {
    std::bitset<16> b;
    sizeof getN(b); // assuming you don't know the type, you can use the object
}

诀窍是使函数模板自动推导出类型,然后返回对字符数组的引用.该函数不需要定义,唯一需要的是它的类型.


理查德科登.我的意思是通常不可能选择任意模板参数.考虑一下:template