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

时间:2011-07-25 06:20: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.
};

现在,当用户希望将开始和结束迭代器提供给包含应该解析的列数的数据结构时,模板参数很重要;但是,如果用户未能将迭代器作为参数提供,则该类应自动假定应解析所有列。

在第二种情况下,声明类实例的代码看起来很笨重:

icsv_params<> params(...);

此外,位类型noqtquotmmap仅由此类使用,因此将它们放在类定义中是有意义的;但是,如果用户希望使用这些位掩码类型,那么执行此操作的代码也很难实现:

icsv_params<> params(icsv_params<>::noqt);

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

3 个答案:

答案 0 :(得分:4)

不幸的是这是C ++语法。 IIRC,在C ++ 0x中,有相关的命名空间(解决了你的第二个问题)。

对于第一个,typedef应该这样做,àla STL:

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

typedef basic_icsv_params<> icsv_params:

答案 1 :(得分:0)

通常对于迭代器参数,迭代器类型是仅对需要它们的函数的模板参数。例如,如果查看std::vector构造函数,则使用begin()和end()迭代器进行模板化,但不是整个类型。

答案 2 :(得分:0)

在我看来,放置角撑是事实上更好的方法。因为,他们不能被激励,替代方式可以,

typedef icsv_params<> icsv_params_default;