如果我被允许做以下事情:
template <typename T = int>
class Foo{
};
Run Code Online (Sandbox Code Playgroud)
为什么我不允许在主要方面做以下事情?
Foo me;
Run Code Online (Sandbox Code Playgroud)
但我必须指明以下内容:
Foo<int> me;
Run Code Online (Sandbox Code Playgroud)
C++ 11引入了默认模板参数,现在它们对我完全理解是难以理解的.
我有一个类模板,类似于下面的类模板,旨在包含解析CSV文件时使用的一些配置设置:
template <typename InputIterator = default_all>
class icsv_params
{
// Iterator to a data structure containing the columns
// that should be read.
typedef InputIterator iterator;
// This is a bitmask type.
typedef detail::icsv_op icsv_op;
static const icsv_op noqt = icsv_op(detail::csv_flags::noqt);
static const icsv_op quot = icsv_op(detail::csv_flags::quot);
static const icsv_op mmap = icsv_op(detail::csv_flags::mmap);
// The rest of the class definition isn't relevant.
};
Run Code Online (Sandbox Code Playgroud)
现在,当用户希望将开始和结束迭代器提供给包含应该解析的列数的数据结构时,模板参数很重要; 但是,如果用户未能将迭代器作为参数提供,则类应自动假定应解析所有列.
在第二种情况下,声明类实例的代码看起来很笨重:
icsv_params<> params(...);
Run Code Online (Sandbox Code Playgroud)
此外,该位掩码类型noqt,quot以及mmap仅由本级使用,所以是有意义的把他们在类定义内; 但是,如果用户希望使用这些位掩码类型,那么执行此操作的代码也很笨重:
icsv_params<> params(icsv_params<>::noqt);
Run Code Online (Sandbox Code Playgroud)
我怎样才能使用户不需要提供尖括号来指示缺少模板参数?如果没有办法这样做,你会建议什么选择?
<>在指定具有其所有模板参数的默认值的模板类时,是否有必要说明原因?
例如
#include <iostream>
template<typename T = int>
class C {
public:
T obj = 0;
};
int main()
{
C c1; // Error on almost all compilers (see note below)
C<> c2;
std::cout << c1.obj << " " << c2.obj << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这样做的一个示例缺点是,如果您有一个已在各个地方使用的类,并且您稍后将其重构为具有其模板参数的默认参数的类模板,那么您必须添加<>所有使用该模板参数的地方类.
注意:看起来GCC最新的HEAD(7.0.1)不接受语法<>.早期版本没有,也没有任何版本的Clang.这是最新的GCC HEAD中的错误吗?或者也许C++ 17的标准现在接受语法而没有<>GCC就在这里?