在具有许多模板参数的类上操作

时间:2016-01-12 18:59:55

标签: c++ templates

我正在编写一个对具有许多模板参数的类型进行操作的函数。例如:

template <typename A, typename B, typename C, int MinSize, int MaxSize>
struct Foo {
   // ...
};

我的函数可以在任何Foo上运行 - 我不关心模板参数。我可以编写一个函数模板来接受这些对象:

template <typename A, typename B, typename C, int MinSize, int MaxSize>
void do_work(const Foo<A, B, C, MinSize, MaxSize>& foo) {
   // ...
}

这很好但看起来有点冗长。如果do_work已经是模板,那就更糟了。模板参数的数量变得非常快,我认为它变得难以理解。这是我应该关注的事情还是这种事情一直在发生?

还有另一种方法可以编写do_work,这样我就不必包含所有Foo的模板参数了吗?也许使用更通用的模板和static_assert来确保我获得Foo

template <typename FooType>
void do_work(const FooType& foo) {
   // make sure foo is a 'Foo<...>'
   static_assert(??)
}

2 个答案:

答案 0 :(得分:4)

可变参数模板怎么样:

template <typename ...Args>
void do_work(const Foo<Args...>& foo) { /* ... */ }

但是,您不会轻易获得单个模板参数,但这可能会有所帮助。

答案 1 :(得分:0)

我认为static_assert()的想法并不坏,实际上,因为它假设foo的性质是明确的。您静态断言该类型具有名为is_foo的静态布尔成员,该成员设置为true。

static_assert(FooType::is_foo);

只有在定义

时才会返回true
template <class C, ...>
class Foo {
public:
   static bool const is_foo = true;
}