【问题标题】:Handling zero-argument variadic template in C++11在 C++11 中处理零参数可变参数模板
【发布时间】:2015-07-04 22:49:44
【问题描述】:

考虑以下人工示例:

template <typename T, typename... Args>
struct A {
  typedef T Type;
};

使用带有 1 个或多个参数的 A 有效,而使用带有零参数的 A 按预期失败:

错误:模板参数的数量错误(0,应该是 1 或更多)

如果没有参数,是否可以让A 处理定义A::Typeint 的零模板参数的情况,如果有则处理第一个模板参数?

【问题讨论】:

  • 你可以将 f 重载为一个带有 0 个参数的函数
  • 我知道,但我正在寻找如何在课堂上做到这一点。 f 只是使用类的一个例子。
  • 我已经删除了对 f 的引用以避免混淆。

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


【解决方案1】:

首先将主模板定义为最一般的情况——也包括零参数:

template <typename... Args>            //general : 0 or more 
struct A { using Type = int; }

然后部分将其专门用于1个或多个参数:

template <typename T, typename... Args> //special : 1 or more
struct A<T,Args...>  { using Type = T; }

一旦你有了这个专业化,主模板将用于零参数

请注意,在数学上 1 或更多0 或更多 的特例——后者是更一般的情况 (不是相反)。

【讨论】:

  • 我很想以template &lt;typename... Args&gt; struct A; 开头,以及(而不是替换)您在此处拥有的代码。这是我对所有复杂模板所做的事情。 (不过,没有批评这个答案!)
  • @AaronMcDaid:好的,这只是一个声明(有时会有所帮助,并不意味着我们应该始终遵循它)。我的代码中的主要模板是声明和定义。
【解决方案2】:

你可以只为第一个参数添加一个默认值,不需要专门化:

#include <type_traits>

template <typename T = int, typename... >
struct A {
    using type = T;
};

int main() {
    static_assert(std::is_same<A<>::type, int>::value, "");
    static_assert(std::is_same<A<double, char>::type, double>::value, "");
}

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2012-08-14
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多