C++ 可变成员函数模板是否可能有两个参数的基本情况?

C++ 可变成员函数模板是否可能有两个参数的基本情况?,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,考虑以下代码: class Foo { public: template<typename X, typename T, typename ... Args> static void f( ); //template<typename X, typename T> static void f( ); template<typename X> static void f( ); }; template<typename X>

考虑以下代码:

class Foo {
public:
    template<typename X, typename T, typename ... Args> static void f( );
    //template<typename X, typename T> static void f( );
    template<typename X> static void f( );
};

template<typename X> void Foo::f( ) {
    cout << "Swallowed the last argument." << endl;
}

/*
template<typename X, typename T> void Foo::f( ) {
    cout << "Swallowed last two arguments." << endl;
}
 */

template<typename X, typename T, typename ... Args> void Foo::f( ) {
    cout << sizeof (T ) << endl;
    Foo::f <X, Args...>( );
}


...
    Foo::f<void*, int, double, long>( );
...
然而,在我正在处理的特定问题中,我希望在一个级别之前停止递归,如注释掉的代码所示。当这些行没有注释掉时,我得到错误(gcc 4.8.3):

g++-Wall-std=c++1y-march=native-fmessage length=0-Wno multichar-g-c-o obj/OneOff/OneOff.o OneOff/OneOff.cpp
OneOff/OneOff.cpp:在“static void Foo::f()[with X=void*;T=double;Args={long int}]的实例化中:
OneOff/OneOff.cpp:132:23:从“静态void Foo::f()[with X=void*;T=int;Args={double,long int}]中需要”
OneOff/OneOff.cpp:137:36:此处为必填项
OneOff/OneOff.cpp:132:23:错误:重载“f()”的调用不明确
Foo::f();
^
OneOff/OneOff.cpp:132:23:注:候选人为:
OneOff/OneOff.cpp:130:58:注意:静态void Foo::f()[其中X=void*;T=long int;Args={}]
模板void Foo::f(){
^
OneOff/OneOff.cpp:125:39:注意:静态void Foo::f()[带X=void*;T=long int]
模板void Foo::f(){
^
gmake:**[obj/OneOff/OneOff.o]错误1
是否可以告诉编译器双参数版本是专门化/基本情况。例如,使用类似<..,typename Args={}>?

我发现的另一种选择是将f()更改为:

模板void Foo::f(){

cout一个非常简单的选项是向递归案例中添加一个额外的模板参数,以便仅当至少有三个参数时才选择它:

class Foo {
public:
    template<typename X, typename T, typename U, typename ... Args> static void f( );
    template<typename X, typename T> static void f( );
};


template<typename X, typename T> void Foo::f( ) {
    cout << "Swallowed last two arguments." << endl;
}

template<typename X, typename T, typename U, typename ... Args> void Foo::f( ) {
    cout << sizeof (T ) << endl;
    Foo::f <X, U, Args...>( );
}
class-Foo{
公众:
模板静态void f();
模板静态void f();
};
模板void Foo::f(){
cout选项#1
让可变版本采用至少三个固定类型模板参数:

template <typename X, typename T, typename V, typename... Args>
static void f();

// ...

template <typename X, typename T, typename V, typename... Args>
void Foo::f()
{
    Foo::f<X, V, Args...>( );
}
模板
静态空隙f();
// ...
模板
void Foo::f()
{
Foo::f();
}

选项2 如果包装尺寸等于0,则使用SFINAE禁用可变版本:

#include <type_traits>

template <typename X, typename T, typename... Args>
static auto f()
    -> typename std::enable_if<(sizeof...(Args) > 0)>::type;

//...

template <typename X, typename T, typename... Args>
auto Foo::f()
    -> typename std::enable_if<(sizeof...(Args) > 0)>::type
{
    Foo::f<X, Args...>( );
}
#包括
模板
静态自动f()
->typename std::enable_if 0)>::type;
//...
模板
自动Foo::f()
->typename std::enable_if 0)>::type
{
Foo::f();
}

class Foo {
public:
    template<typename X, typename T, typename U, typename ... Args> static void f( );
    template<typename X, typename T> static void f( );
};


template<typename X, typename T> void Foo::f( ) {
    cout << "Swallowed last two arguments." << endl;
}

template<typename X, typename T, typename U, typename ... Args> void Foo::f( ) {
    cout << sizeof (T ) << endl;
    Foo::f <X, U, Args...>( );
}
template <typename X, typename T, typename V, typename... Args>
static void f();

// ...

template <typename X, typename T, typename V, typename... Args>
void Foo::f()
{
    Foo::f<X, V, Args...>( );
}
#include <type_traits>

template <typename X, typename T, typename... Args>
static auto f()
    -> typename std::enable_if<(sizeof...(Args) > 0)>::type;

//...

template <typename X, typename T, typename... Args>
auto Foo::f()
    -> typename std::enable_if<(sizeof...(Args) > 0)>::type
{
    Foo::f<X, Args...>( );
}