1

我有一个类似于以下定义的类:

template< typename A, typename... B >
struct S {
    //...//
};

但我想像这样(有效地)创建一个重载:

template<>
struct S<> {
    //...//
};

然而,上面显然是非法的,我不能使用可变模板,并传递零参数给它,因为这可能与第一个定义模棱两可(和不好的做法)。有没有办法在 C++ 中创建一个零参数的模板说明符?

4

1 回答 1

8

问题是您正在尝试创建与主模板不匹配的部分特化(主模板至少需要一个参数)。如果你想使用可变参数模板,你可以这样做:

template <typename... A>
struct S {
  // One-or-more case
};

template <>
struct S<> {
  // Zero case
};

根据评论,发帖人想找到非空案例的第一个论据;对此的修改是:

template <typename... A>
struct S;

template <>
struct S<> {
  // Zero case
};

template <typename A, typename... B>
struct S<A, B...> {
  // One-or-more case
};
于 2013-10-26T22:44:01.377 回答