C++ 在具有多个模板参数的类上操作

C++ 在具有多个模板参数的类上操作,c++,templates,C++,Templates,我正在编写一个函数,它对一个具有许多模板参数的类型进行操作。例如: template <typename A, typename B, typename C, int MinSize, int MaxSize> struct Foo { // ... }; 这很好,但似乎有点冗长。如果do_work已经是一个模板,情况会变得更糟。模板参数的数量变得非常快,我认为这很难理解。这是我应该关心的事情还是这种事情一直都在发生 是否有其他方法可以编写do_work,这样就不必包含所有F

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

template <typename A, typename B, typename C, int MinSize, int MaxSize>
struct Foo {
   // ...
};
这很好,但似乎有点冗长。如果do_work已经是一个模板,情况会变得更糟。模板参数的数量变得非常快,我认为这很难理解。这是我应该关心的事情还是这种事情一直都在发生

是否有其他方法可以编写do_work,这样就不必包含所有Foo的模板参数?也许使用一个更通用的模板和一个静态的_断言来确保我得到一个Foo


实际上,我认为静态断言的想法并不坏,因为它明确了关于foo本质的假设。静态断言该类型有一个名为is\u foo的静态布尔成员,该成员设置为true

static_assert(FooType::is_foo);
只有当您定义

template <class C, ...>
class Foo {
public:
   static bool const is_foo = true;
}

实际上,我认为静态断言的想法并不坏,因为它明确了关于foo本质的假设。静态断言该类型有一个名为is\u foo的静态布尔成员,该成员设置为true

static_assert(FooType::is_foo);
只有当您定义

template <class C, ...>
class Foo {
public:
   static bool const is_foo = true;
}

变量模板如何:

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

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

可变模板如何:

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

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

如果不使用静态断言,您就不必在意并使用第二个版本。如果用户传递了错误的参数,可能会出现错误。这也是一个完全正确的答案。我只是想知道是否有一些TMP黑魔法可以使错误更容易诊断。您可以使用sfinae检查对象是否有正确的接口来执行您的操作work@zmb字体有,但是如果你有很多参数的话,它只会开始变得比拼写参数更详细。你可以不在意,在没有静态断言的情况下使用第二个版本。如果用户传递了错误的参数,可能会出现错误。这也是一个完全正确的答案。我只是想知道是否有一些TMP黑魔法可以使错误更容易诊断。您可以使用sfinae检查对象是否有正确的接口来执行您的操作work@zmb:有,但是如果你有很多参数的话,它只会比拼写参数更加冗长。