基本上我想到的是:
template<typename... Types>
class Foo
{
void Bar(Types var) {};...
};
当像这样专业时:
Foo<S1, S2, S3> foo;
扩展为:
class Foo
{
void Bar(S1 var){};
void Bar(S2 var){};
void Bar(S3 var){};
};
显然,它在某种程度上没有意义,但我会很高兴看到一些想法。
答案 0 :(得分:6)
template<class D, class T>
struct FooHelper {
void Bar(T var) {
auto* self=static_cast<D*>(this);
// here use self instead of this
};
};
template<typename... Types>
class Foo: FooHelper<Foo,Types>...
{
template<class D,class T>
friend struct FooHelper<D,T>;
};
这就是你想做的事情。
我们使用CRTP为基类提供Foo
中所有内容的访问权限。
答案 1 :(得分:4)
这是一个很好的C ++方法:
template<typename T>
struct HelpFoo {
void Bar(T) {}
};
template<typename... Types>
struct Foo : HelpFoo<Types>...
{
using HelpFoo<Types>::Bar...;
};
答案 2 :(得分:2)
您可以让您的方法模板化,并使用enable_if
启用包列表中的那些:
#include <type_traits>
template<class... Ts>
struct foo {
template<class T, std::enable_if_t<
std::disjunction_v<std::is_same<T, Ts>...>, int> = 0>
void bar(T);
};