c++ - 避免使用带有默认参数的类模板的括号

标签 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);

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

最佳答案

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

对于第一个,typedef 应该可以,à la STL:

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

typedef basic_icsv_params<> icsv_params:

关于c++ - 避免使用带有默认参数的类模板的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6812389/

相关文章:

c++传递大 vector 作为输出

c++ - 一个模板化的 'strdup()' ?

django - 如何在 django 模板中循环 7 次

javascript - 这个javascript的目的,它使用了什么样的设计模式?

java - 生产者/消费者模式与观察者模式的区别

c++ - 试图从整个应用程序访问 QGLWidget

c++ - 调用空类方法会影响性能吗?

java - 什么样的设计模式适合我的需要?

c++ - Wxwidgets回调

c++ - map 比较构造函数参数