是否可以将参数包扩展为不同的成员函数?

时间:2018-02-25 12:33:17

标签: c++ templates

基本上我想到的是:

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){};
};

显然,它在某种程度上没有意义,但我会很高兴看到一些想法。

3 个答案:

答案 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);

};