我正在编写一个对具有许多模板参数的类型进行操作的函数。例如:
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(??)
}
答案 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);
只有在定义
时才会返回truetemplate <class C, ...>
class Foo {
public:
static bool const is_foo = true;
}