【发布时间】:2019-04-06 12:43:25
【问题描述】:
我是 C++ 元编程的新手。我试图查看其他答案,但找不到适合我的问题的答案。 或者只是我无法将它应用到我的案例中。 在这里,我将发布代码的简化版本,以突出显示我想要获得的主要功能。
我想要实现的是构造一个维度为N(N 在编译时已知)的std::tuple,
其组件类型由模板类MyType 给出,取决于两个参数M 和N。
M 是固定的,而元组组件i 的类型实际上是MyType<M,i>,对于i=0,...,N。
因为我必须递归地定义这些类型的元组,所以我考虑了DefineType 模板。
// general definition
template<Integer M, Integer N>
struct DefineType
{
using rest = typename DefineType<M, N-1>::type;
using type = decltype(std::tuple_cat(std::declval< std::tuple< MyType<M,N>>>(),
std::declval<rest>() ));
};
// specialization for N=0
template<Integer M>
struct DefineType<M,0>
{
using type = typename std::tuple< MyType<M,0> >;
};
这应该产生以下类型:
DefineType< M, N=0 >:std::tuple< MyType< M,0 > >;
DefineType< M, N=1 >:std::tuple< MyType< M,0 >, MyType< M,1 > >;
DefineType< M, N=2 >: std::tuple< MyType< M,0 >, MyType< M,1 > , MyType< M,2 > >;
以此类推,直到一般N。
然后我还想根据我称之为param 类型Param 的东西来初始化这种类型的元组。为此,
我写了这样的代码:
// general definition
template<Integer M, Integer N>
typename DefineType<M,N>::type MyClass(Param param)
{
return std::tuple_cat(std::tuple<MyType<M,N>>(MyType<M,N>(param)),
MyClass<M,N-1>(param) ) ;
}
// specialization for N=0
template<Integer M>
typename DefineType<M,0>::type MyClass(Param param)
{
return std::tuple<MyType<M, 0>>(MyType<M, 0>(param));
}
终于进入正题了:
int main()
{
// M and N given
const auto myobject=MyClass<M,N>(param);
}
代码没有编译,抱怨我初始化太多次DefineType<M,N>。基本上N 没有达到基本情况,N=0。我不明白为什么......所以肯定递归类型定义是错误的。但是,除此之外,也许还有其他我看不到的错误。我希望你能帮助我理解如何做到这一点。我很抱歉,但元编程对我来说是非常新的(也很困难)。
谢谢。
【问题讨论】:
-
您只需要 C++11 的答案,还是也接受 C++14/C++17 的解决方案?
标签: c++ c++11 templates recursion template-meta-programming