2011-02-11 2 views
6

형질과 형질을 형판 매개 변수로 전달

typedef basic_ofstream< char, char_traits<char> >

typedef basic_ofstream<char> 같은 기존 구조체를 사용하는 대신 특성을 템플릿 매개 변수로 전달하는 것이 실용적인 경우는 언제입니까?

일부 일반적인 타일 (특성)을 갖고 싶은 타일 클래스가 있으므로 tile_traitsflag_type와 같은 타일에 대한 모든 기본 정보를 포함하도록 tile_traits을 디자인했습니다.

//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. 
} 

그런 특성을 형질 - blob로 간주하고 있습니까?

+0

용어 특성 - blob은 나에게 알려지지 않았습니다. 그것은 다른 질문에 언급되어 있습니다 http://stackoverflow.com/questions/1870627/type-traits-definition-traits-blobs-metafunctions – Suma

답변

12

형질의 디자인은 다른 무엇보다도 예술입니다. 여기 하드 및 빠른 답변이 없습니다. 나는이 문제가 답을 찾지 못했기 때문에 문제에 대해 더 많이 알지 못해서 좋은 대답을 드릴 수 없다고 말하면 당신이 풀고있다.

일반적으로 특성 클래스는 유용한 "사용자 지정 지점"입니다. 당신 템플릿을 설계하는 경우 즉, :

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

TileContainer 타일의 일부 속성에 대한 tile_traits<Tile>의 사용을 만들 수 있습니다. 그리고 TileContainer의 클라이언트는 이 기본 특성 (있는 경우)이 다를 때 속성의 변형을 알리기 위해 tile_traits<MyTile>을 전문화 할 수 있습니다.

지금까지 나는 당신이 이미 알지 못하는 것을 말한 적이 없다고 생각합니다. ( 에서 귀하의 질문에 대한 말로 판단하십시오).

나는 당신의 질문은 생각 :

당신이 설계해야 :

A)

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_traits에 비해 몇 가지 특징 다른 인 경우 다를 수 TileContainer의 유형을 강제로 할 때 고객이 같은 타일에 대해 서로 다른 특성이 필요하거나 수 있다는 것을 의심 익숙한.

+0

이것은 질문 # 1에 대한 나의 모든 의심을 요약 한 것입니다. # 2 질문에 대한 대답은 당신이 말했듯이 좋은 대답을하는 것이 거의 불가능하고 스타일에 더 관련이 있다고 생각합니다. ** C++ Template Metaproming **에 대해 이야기해야 할 것 같습니다. 지금 당장 –

6

사람들이 동일한 데이터 유형에 대해 다른 특성을 전달한다는 것을 알게되면 traits 클래스를 템플릿 매개 변수로 사용해야합니다. 타일마다 항상 각 T에 대해 동일한 tile_traits가 있으면 직접 사용할 수 있습니다.

가끔 누군가가 my_special_traits를 사용하는 것을 볼 수 있다면, 별도의 템플릿 매개 변수로 그 값을 가져야합니다.

1

특성에 대한 기본값을 제공하고 traits 매개 변수가 항상 유연한 것을 보면서 수행 할 수없는 몇 가지 구체적인 이유가없는 한이 방법을 선택합니다.

template<class Bar,class Traits=FooTraits<Bar> > 
class Foo 
{}; 
+0

질문을 한 번 더 읽고, 나는 그 대답이 아마도 두 번째와 관련이 없다는 것을 인정합니다. 나는 정말로이 질문이 무엇인지 모른다. Foo 템플릿 클래스의 정의와 관련이있는 것으로 보지 않으며, 특성 자체에만 관련이 있습니다. 응답은 간단합니다. 기성품의 특성이 당신에게 어울리면 그것을 사용하고, 사용하지 않을 때는 자신의 것을 제공하십시오. – Suma

관련 문제