2014-12-01 2 views
2

Следующий пример должен проиллюстрировать мой вопрос: если у меня есть класс в качестве параметра шаблона, как я могу использовать (постоянные) свойства класса ...Как использовать свойство класса в качестве параметра шаблона/для специализации?

  1. Непосредственно, как указано линией, обозначенной с (1). Насколько мне известно, это должно сработать. Это «правильный» способ?

  2. В качестве параметра для специализации шаблона. Поэтому я хотел бы специализировать один из контейнеров для фиксированных и один для нефиксированных. Здесь я понятия не имею. Пример

Код:

class IdxTypeA{ 
    const bool fixed = true; 
    const int LEN = 5; // len is fixed on compile time 
} 

class IdxTypeB{ 
    const bool fixed = false; 
    int len; // len can be set on runtime 
} 

class IdxTypeC{ 
    const bool fixed = false; 
    int len; // len can be set on runtime 
} 

template<class IDX> class Container { } 

template<> 
class Container<here comes the specialisation for fixed len>{ 
    int values[IDX.LEN]; // **** (1) ***** 
} 

template<> 
class Container<here comes the specialisation for not fixed length>{ 
    ... 
} 

(Речь идет не о контейнерах, это просто грубый пример.)

ответ

1

Во-первых, вам необходимо включить свойства во время компиляции в фактической постоянной выражения, делая их static:

class IdxTypeA { 
    static const bool fixed = true; 
    static const int LEN = 5; // len is fixed on compile time 
} 

с этим на месте, вы можете (Частично) специализируются на них просто отлично, с somethig, как это:

template<class IDX, bool IS_FIXED = IDX::fixed> class Container; 

template <class IDX> 
class Container<IDX, true> 
{ 
    int values[IDX::LEN]; 
}; 

template <class IDX> 
class Container<IDX, false> 
{ 
}; 
+0

Я выяснен вопрос немного: Это может быть, что у меня есть IdxTypeC, IdxTypeD, и так далее, которые могут быть фиксированными или не фиксированы. Все они должны вызывать правильную специализацию. Поэтому я бы не хотел специализироваться на типе, но для определенного свойства в нем. – Michael

Смежные вопросы