htz*_*fun 8 c++ templates constexpr c++11
假设我有这样的定义类:
template<unsigned int N>
class A { ... }
Run Code Online (Sandbox Code Playgroud)
问题是如何用N迭代这些类?
for(unsigned int i = 0; i < 10; ++i) {
A<i>().doStuff();
}
Run Code Online (Sandbox Code Playgroud)
也许C++ 11中有一些新功能或者使用contrexp很酷.
接下来的问题是:如果可能的话 - 如何存储这些类?
更新 我知道它在编译时工作.假设,我有多达10个这样的全局类,它们仅在N中有所不同.例如:
A<1> first;
A<2> second;
A<42> third;
A<1034> fourth;
Run Code Online (Sandbox Code Playgroud)
并且假设,我应该称那个N比我的价值大的人.如果没有机会进行迭代,那么我必须编写长if-else结构.
void doAppropriateStuff(int value) {
if (value < 1) {
first.doStuff();
} else if (value < 2) {
second.doStuff();
} else if (value < 42) {
third.doStuff();
} else if (value < 1034) {
fourth.doStuff();
} else {
...
}
}
Run Code Online (Sandbox Code Playgroud)
希望,问题变得更加清晰.当我用Google搜索时,这是不可能的,我理解为什么.只希望C++ 11和SO社区.谢谢.
jro*_*rok 10
使用for循环显然是不可能的,因为它在运行时运行,模板参数需要是编译时常量.这是你如何做到的.
这些是用于构造整数序列作为模板参数包的实用程序类:
template< std::size_t... Ns >
struct indices {
typedef indices< Ns..., sizeof...( Ns ) > next;
};
template< std::size_t N >
struct make_indices {
typedef typename make_indices< N - 1 >::type::next type;
};
template<>
struct make_indices< 0 > {
typedef indices<> type;
};
Run Code Online (Sandbox Code Playgroud)
完成工作的功能:
#include <initializer_list>
template<size_t... Is>
void foo(indices<Is...>)
{
auto list = { (A<Is>().doStuff(), 0)... };
}
Run Code Online (Sandbox Code Playgroud)
你调用这个函数:
foo(make_indices<10>::type());
Run Code Online (Sandbox Code Playgroud)
如果你不想依赖c ++ 14的integer_sequence,这是一个更简单的解决方案:
#include <iostream>
template<unsigned int N>
struct A {
void dostuff() const { std::cout << N << " "; }
};
template < int N > void run();
template <> void run<-1>() {}
template < int N > void run() {
run<N-1>();
A<N>{}.dostuff();
}
int main() {
run<10>();
}
Run Code Online (Sandbox Code Playgroud)
编辑:关于你的问题更新,你可以这样做,如果你将对象存储在元组中,请看这里:
#include <iostream>
#include <tuple>
template<unsigned int N>
struct A {
unsigned int getN() const { return N; }
void dostuff() const { std::cout << N << " "; }
};
auto globals = std::make_tuple( A<3>{}, A<7>{}, A<10>{}, A<200>{} );
template <int idx> void run( int v );
template <> void run<std::tuple_size<decltype(globals)>::value>( int ) {}
template <int idx = 0> void run( int v ) {
auto & a = std::get<idx>(globals);
if ( v < a.getN() ) {
a.dostuff();
} else {
run<idx+1>(v);
}
}
int main() {
for( int i = 0; i<20; ++i)
run( i );
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
895 次 |
最近记录: |