以下简单的代码模式在图形编程中非常常见。
它创建一个层数组并在它们之上循环。
struct Layer
{
int n;
void operator()(float value)
{
}
};
struct AnotherLayer
{
int n;
int m;
void operator()(float value)
{
}
};
void process_layers(Layer_t* layer, size_t size, float value)
{
for (size_t n = 0; n < size; ++n)
layer[n](value);
}
Layer a = {1};
Layer b = {2};
AnotherLayer c = {2,3};
typedef std::function < void (float) > Layer_t;
Layer_t layers [] = {a,b,c};
process_layers(layers, sizeof(layers)/sizeof(Layer), 100);
我想将其转换为在 c++11 中使用可变参数模板。任何想法我怎么能做到这一点。这就是我希望它看起来的样子。有任何想法吗?这甚至可能吗?
template <int n>
struct Layer
{
void operator()(float value)
{
}
};
template <int n, int m>
struct AnotherLayer
{
void operator()(float value)
{
}
};
template <typename Layer1, typename Layer2, ...>
struct Layers //process_layers
{
void operator()(float value)
{
for (size_t n = 0; n < SIZEOF(Layer1,Layer2,...); ++n)
Layer[N]()(value);
}
};
然后我可以做到这一点。
typedef Layers<Layer<1>, Layer<2>, AnotherLayer<3,8> > funky_layer_t;
typedef Layers<Layer<4>, Layer<5>, Layer<5>, AnotherLayer<6,7> > standard_layer_t;
typedef Layers<funky_layer_t, standard_layer_t> awesome_layer_t;
awesome_layer_t()(100);
注意:使用第二种方法,构建层的所有参数在编译时都是已知的。