【发布时间】:2011-07-25 06:20: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.
};
现在,当用户希望为包含应该解析的列数的数据结构提供开始和结束迭代器时,模板参数很重要;但是,如果用户未能将迭代器作为参数提供,该类应该自动假定所有列都应该被解析。
在第二种情况下,声明类实例的代码看起来很笨拙:
icsv_params<> params(...);
此外,位掩码类型noqt、quot 和mmap 仅由此类使用,因此将它们放在类定义中是有意义的;但是,如果用户希望使用这些位掩码类型,那么执行此操作的代码也很笨拙:
icsv_params<> params(icsv_params<>::noqt);
我怎样才能使用户不需要提供尖括号来指示缺少模板参数?如果没有办法,您会建议什么替代方案?
【问题讨论】:
-
函数模板不需要括号。假设 C++0x 那么用户代码可以做
auto params = some_factory_function(...);. -
自 C++17 以来,情况发生了变化。现在你可以omit angle brackets。
标签: c++ templates design-patterns