是否有简单的方法可以使用常用函数重载变量模板函数,如此处为构造函数所示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
为构造函数显示了类似的解决方案。我需要超载需求
答案 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);
}