c++ - 使用专门的可变参数模板类的声明

标签 c++ c++11 variadic-templates using-statement

是否可以定义FloatType,以便我可以将f1声明为

FloatType f1;

而不是

FloatType<> f1;

如果我尝试使用前者,我会得到一个

错误:使用类模板“FloatType”需要模板参数

template <typename T, typename... Args>
class Type
{
};

template <typename... Args>
class Type<float, Args...>
{
};

template <typename... Args>
using FloatType = Type<float, Args...>;

int
main(int, char **)
{
    FloatType<> f1;
    FloatType<float> f2;

    return 0;
}

最佳答案

不,那是不可能的。从标准§14.3/4,强调我的:

When template argument packs or default template-arguments are used, a template-argument list can be empty. In that case the empty <> brackets shall still be used as the template-argument-list. [ Example:

  template <class T = char> class String;
  String<>* p; // OK: String<char>
  String* q;   // syntax error

  template <class ... Elements> class Tuple;
  Tuple<>* t; // OK: Elements is empty
  Tuple* u;   // syntax error

—end example ]

但是,写 FloatType<> 有什么问题吗? ?如果看到空括号确实让您烦恼,您可以为它们引入另一个别名,但这会使事情变得困惑:

using DefFloatType = FloatType<>;

此外,还需要更多打字!

关于c++ - 使用专门的可变参数模板类的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28102382/

相关文章:

c++ - g++ 和 clang++ 不同的行为与指向可变参数模板函数的指针

c++ - VC++编译器和类型转换?

c++ - make_pair 不适用于字符串,适用于字符串&

c++ - std::unordered_map - 使用 Lambda 专门化 KeyEqual

C++需要一个容器来存储用户定义的函数

c++ - 模板类的多个可变参数包

c++ - 如何调用所有基类的析构函数? (或一个共同的功能)

c++ - move std::unique_ptr的构造函数/分配:内存重新分配?

c++ - CppUnit 1.12.1 中缺少库

c++ - Qt5:使用 QSortFilterProxyModel 时拖放