use*_*370 2 c++ recursive-datastructures initializer-list constexpr c++11
是否可以使用C++ 11 使用构造函数initializer_list组装递归定义的类Foo,如下所示constexpr:
template <size_t N>
struct Foo {
constexpr Foo(int x, Foo<N-1> f) : x(x), xs(xs) {}
int x;
Foo<N-1> xs;
};
template <> struct Foo<0> {};
Run Code Online (Sandbox Code Playgroud)
我可以初始化一个Foo<3>使用:
int main(int argc, char *argv[])
{
Foo<3> a = Foo<3>(1,Foo<2>(2,Foo<1>(3,Foo<0>())));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最好使用Foo <3> a = {1,2,3}.如果有一个constexpr tail功能,initializer_list我认为它应该工作.
是的,以一种循环方式,有效地解压缩并将初始化列表重新打包为更合适的格式.但是,有一种更好的(imho)方式:Variadic模板.
#include <stddef.h>
#include <iostream>
template <size_t N>
struct Foo {
template<class... Tail>
constexpr Foo(int i, Tail... t) : x(i), xs(t...) {}
void print(){
std::cout << "(" << x << ", ";
xs.print();
std::cout << ")";
}
int x;
Foo<N-1> xs;
};
template <>
struct Foo<1> {
constexpr Foo(int i) : x(i) {}
void print(){ std::cout << "(" << x << ")"; }
int x;
};
int main(){
Foo<3> x = {1, 2, 3};
x.print();
std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)
按预期输出:
(1,(2,(3)))
请注意,我选择1作为基本情况,因为它更有意义.
| 归档时间: |
|
| 查看次数: |
1855 次 |
| 最近记录: |