c++ - 在可变数量的标记碱基上进行模板化

标签 c++ templates c++11

我正在尝试构建一个涉及多次从同一基数继承的实用程序,我正在通过对整数进行模板化以使基数不同来实现。不幸的是,我发现自己写了如下内容:

template<size_t I>
struct X {};

template<size_t Len>
struct Y { static_assert(false, "exceeded max length"); };

template<>
struct Y<0> {};

template<>
struct Y<1> : X<0> {};

template<>
struct Y<2> : X<0>, X<1> {};

template<>
struct Y<3> : X<0>, X<1>, X<2> {};

虽然这在过去的讨厌的 C++ 时代曾经是一种非常常见的模式,但我不禁觉得可以在 C++11 中做得更好,尽管细节让我难以理解。

对于任意 Len,这可以简洁地完成吗?

(也欢迎任何关于更好标题的想法)

最佳答案

如果层次结构不必是扁平的,那么:

#include <iostream>
#include <iomanip>
#include <type_traits>

template<size_t N> struct X : X<N - 1> {};
template<> struct X<0> {};

template<size_t N>
struct Y : X<N - 1> {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_base_of<X<0>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<1>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<2>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<3>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<4>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<5>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<6>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<7>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<8>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<9>, Y<10>>::value << "\n";  // true
    std::cout << std::is_base_of<X<10>, Y<10>>::value << "\n"; // false

}

查看在线演示 http://ideone.com/wsgAhQ .

关于c++ - 在可变数量的标记碱基上进行模板化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16700611/

相关文章:

c++ - 我不明白如何将变量从一个类中的方法传递和检索到另一个类中的其他方法

c++ - 将指针数组传递给另一个类

c++ - 特定整数常量的重载比较

c++ - 模板如何影响 C++ 中的隐式声明规则?

c++ - 即使从未实例化引用变量主模板,是否也需要对其进行初始化?

C++:有一个头文件有什么意义吗?

c++ - 为什么在一种情况下使用私有(private)内部类作为参数在 header 中出错,而在另一种情况下在调用函数中出错?

c++ - 这个编译器错误是什么意思 - C++ 中的 "qualified-id in declaration before ‘=’ token ?

c++ - 编写一个接受 lambda 表达式作为参数的函数

c++ - 无效 C 风格强制转换后的方法调用