c++ - 特征和将特征作为模板参数传递

标签 c++ templates idioms traits

什么时候将特征作为模板参数传递而不是简单地使用一些现有的特征结构如

typedef basic_ofstream< char, char_traits<char> >

对比

typedef basic_ofstream< char >

我有一些 tile 类,我希望它们有一些共同点(特征),所以我设计了 tile_traits包含有关图 block 的所有基本信息,例如 int_typeflag_type ,像这样:

//unspecialized
template<typename T> struct tile_traits;
//... other stuff here, declaration of a tile class
template<>
struct tile_traits<tile_class>
{
   typedef tile_class::int_type  int_type;
   typedef tile_class::flag_type flag_type;
   //other possible tile info here.
}

这样设计特征是否被视为特征 block

最佳答案

特质的设计与其他任何事物一样都是一门艺术。没有硬和 在这里快速回答。我相信这个问题没有答案,因为它是 在不了解更多问题的情况下不可能给出好的答案 你正在解决。

一般来说,特征类是一个有用的“定制点”。也就是说,如果你 正在设计模板:

template <class Tile>
class TileContainer
{
    ...
};

TileContainer可能会利用 tile_traits<Tile>对于 Tile 的一些属性。 和TileContainer的客户可以专攻tile_traits<MyTile>为了 当默认特征(如果存在)时传达属性的变化 不正确。

到目前为止,我不认为我说过任何你还不知道的事情(从 你问题的措辞方式)。

我认为你的问题是:

你应该设计:

一个)

template <class Tile, class Traits = tile_traits<Tile>>
class TileContainer
{
    // uses Traits
};

或:

B)

template <class Tile>
class TileContainer
{
    // uses tile_traits<Tile>
};

C++03 和即将推出的 C++0x 标准中都有这两种设计的示例。

示例 A 设计:

template<class charT, class traits = char_traits<charT>,
                      class Allocator = allocator<charT>>
    class basic_string;  // both traits and Allocator are traits

template <class Codecvt, class Elem = wchar_t,
                         class Tr = char_traits<Elem>>
    class wbuffer_convert;

template <class T, class Allocator = allocator<T>>
    class vector; // Allocator is a A-trait that uses another
                  // B-trait internally:  allocator_traits<Allocator>

template <class charT, class traits = regex_traits<charT>>
    class basic_regex;

示例 B 设计:

template<class Iterator> struct iterator_traits;
template <class Alloc> struct allocator_traits;
template <class Ptr> struct pointer_traits;
template <class Rep> struct treat_as_floating_point;
template <class Rep> struct duration_values;

我唯一的建议是设计没有对错之分。使用:

template <class Tile>
class TileContainer
{
    // uses tile_traits<Tile>
};

当您确信客户的需求始终可以通过特化来满足时 tile_traits<MyTile> .

使用:

template <class Tile, class Traits = tile_traits<Tile>>
class TileContainer
{
    // uses Traits
};

当您怀疑您的客户可能需要相同的不同特征时 Tile,或者当你想强制 TileContainer 的类型不同时 使用了 tile_traits 以外的一些特征。

关于c++ - 特征和将特征作为模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4966726/

相关文章:

javascript - 使用 Masterpage 的 AltTemplate 嵌套模板 - Umbraco

c++ - 如何使用模板函数作为 Boost::Unit-test 的自定义谓词

c++ - 具有不同原型(prototype)的函数指针 vector ,我可以构建一个吗?

c++ - 功能模板的特化,不改变其原型(prototype)

java - 图形用户界面

python - 在 Go 中枚举常量的最佳方法

c++ - 从派生类引用基类的更好习惯用法?

c++ - constexpr 参数化函数指针

c++ - 左值引用和右值引用的区别

c++ - 如何申报 SFINAE 类(class)?