避免具有默认参数的类模板的括号

voi*_*ter 11 c++ templates design-patterns

我有一个类模板,类似于下面的类模板,旨在包含解析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)

我怎样才能使用户不需要提供尖括号来指示缺少模板参数?如果没有办法这样做,你会建议什么选择?

Ale*_* C. 5

不幸的是,这是C ++语法。IIRC在C ++ 0x中存在关联的名称空间(可以解决您的第二个问题)。

对于第一个,一个typedef应该做的,点菜 STL:

template <typename InputIterator = default_all>
class basic_icsv_params
{
    ...
};

typedef basic_icsv_params<> icsv_params:
Run Code Online (Sandbox Code Playgroud)