I по существу есть макет версию std::integral_constant
, которая включает в себя переменную, и я хочу, чтобы специализировать шаблон функции для этих классов, производных от Base<T>
, как это:Специализируется шаблон функции для шаблонного производного класса
template<class T> struct Base{
typedef T type;
T t;
};
template<class T> struct A : Base<T>{
static constexpr T value = 1;
};
template<class T> struct B : Base<T>{
static constexpr T value = 2;
};
struct Unrelated{};
// etc.
template<class T> void foo(T t){
//I would like to specialize foo for A and B and have a version for other types
}
int main(){
foo(A<float>());//do something special based on value fields of A and B
foo(B<float>());
foo(Unrelated()); //do some default behavior
}
Вот Основные вопросы:
- я не могу включить
value
в качестве шаблона, как я ожидалT = double
,float
, или некоторые другие нецелых типов (в противном случае я бы просто продлитьstd::integral_constant
) - я не могу чисто использовать
std::is_base
, как я должен был бы сделатьstd::is_base<Base<T::type>,T>
- Ведение
foo(Base<T>&)
не позволил бы мне видетьvalue
, и я не хочу, чтобы прибегать к виртуальнойvalue()
функции (или отражения). - И, очевидно, я бы хотел избежать специализации foo для каждого производного класса.
Я думаю, что ответ заключается в использовании is_base
, но я не смог заставить его работать независимо от того, как я пытался его использовать. Есть ли более простой способ, которым я не хватает?
Конечно, у вас есть опечатка или два. 'template struct A: Base {' должен быть 'template struct A: Base {'. Это твоя проблема? –
+1 для четкого выражения первого * того, что вы пытаетесь сделать, а затем * как * вы пытаетесь это сделать и, наконец, спрашиваете *, как вы должны делать то, что вы пытаетесь сделать. –
Кроме того, прочитайте [это] (http://www.gotw.ca/publications/mill17.htm) –