重载variadic-templated成员函数和variadic-templated函数

时间:2015-10-06 01:56:17

标签: c++ templates c++11 overloading variadic-templates

是否有简单的方法可以使用常用函数重载变量模板函数,如此处为构造函数所示c++ variadic template constructor and common constructors(c ++ 11 - c ++ 14)

$("[data-toggle=popover]").popover({placement: 'right'});

我想#include <iostream> struct S {}; class C { public: void fun(S const&) { std::cout << " fun(S const& ) " << std::endl; } // 1 template<typename ... T> void fun(T&&...) { std::cout << " fun(T&&...) " << std::endl; } // 2 }; int main () { S s{}; C c{}; c.fun(s); c.fun(5); // call 1 - ? } 调用非变量模板版本。使用c.fun(5)std::enable_if为构造函数显示了类似的解决方案。我需要超载需求

1 个答案:

答案 0 :(得分:1)

我做了一个解决方法,不是很优雅

#include <iostream>
#include <type_traits>

struct S {};

class C
{
    class helper
    {
    public:
      helper(S const&) { std::cout << " fun(S const& ) " << std::endl; }

      template<typename ... T, typename = std::enable_if_t<!std::is_constructible<helper, T&&...>::value> >
      helper(T&&...) { std::cout << " fun(T&&...) " << std::endl; }
    };

  public:

  template<typename ... T>
  void fun(T&&... args) { helper { std::forward<T>(args)... }; }


};


int main ()
{
    S s{};
    C c{};

    c.fun(s);
    c.fun(5);

}