2015-08-22 2 views
0

Итак, у меня есть класс шаблонов со статическим членом, значение которого может быть получено только из одного из параметров шаблона, а не для определения значения для каждого возможного значения второго перечисления параметра, можно использовать еще один шаблон для определения один раз для всех возможных значений?Шаблонные элементы статического шаблона

Или лучше проиллюстрировать код ниже:

enum Foo 
{ 
    FOO, 
    BAR 
}; 

enum Bar { 
    OOF, 
    RAB 
}; 

template<Foo foo, Bar bar> 
class FooTemplate 
{ 
public: 
    static const int RESULT; 
}; 


template<Foo foo, Bar bar> 
const int FooTemplate<Foo::FOO, bar>::RESULT = int(bar); 

template<Foo foo, Bar bar> 
const int FooTemplate<Foo::BAR, bar>::RESULT = 0; 

Попытка компиляции производит следующие ошибки компиляции:

C2086 'Const ИНТ FooTemplate :: РЕЗУЛЬТАТ': переопределение

C3860 Список шаблонов шаблонов, следующий за именем шаблона класса, должен содержать параметров в порядке, используемом в списке параметров шаблона

+0

Просто те же формальные параметры шаблона, как у вас есть для шаблона класса. –

+0

@ Cheersandhth.-Alf Спасибо, что исправляет одну из ошибок, но оставляет одну и производит другую. Есть идеи? –

+0

Удалить 'const int' со второго? – erip

ответ

0

Не совсем уверен, что вы хотите, потому что пример, как представляется, более упрощенно, но, по крайней мере, насколько пример идет вы можете выразить это следующим образом:

enum Foo 
{ 
    foo, 
    bar 
}; 

enum Bar { 
    oof, 
    rab 
}; 

template<Foo foo, Bar bar> 
class FooTemplate 
{ 
public: 
    static const int result = (foo == Foo::foo? int(bar) : 0); 
}; 

template<Foo f, Bar b> 
const int FooTemplate<f, b>::result; 

#include <iostream> 
using namespace std; 
auto main() -> int 
{ 
    cout << FooTemplate<foo, oof>::result << endl; 
    cout << FooTemplate<foo, rab>::result << endl; 
    cout << FooTemplate<bar, oof>::result << endl; 
    cout << FooTemplate<bar, rab>::result << endl; 
} 
+0

Я использовал ваш метод, как показано здесь http://pastebin.com/zuBWhe03, единственная проблема в том, что когда у вас есть большие перечисления, цепные тройные выражения становятся немного раздражающими, поэтому было бы лучше, если бы был более хороший способ выразить это. –

1

Вы можете попробовать упростить ваш код, как следует:

#include <type_traits> 

enum Foo { 
    FOO, 
    BAR 
}; 

enum Bar { 
    OOF, 
    RAB 
}; 

template<Foo /*foo*/, Bar /*bar*/> 
struct FooValue; 

template<Bar bar> 
struct FooValue<Foo::FOO, bar> 
    : std::integral_constant<int, bar> { }; 

template<Bar bar> 
struct FooValue<Foo::BAR, bar> 
    : std::integral_constant<int, 0> { }; 

template<Foo foo, Bar bar> 
class FooTemplate 
    : public FooValue<foo, bar> 
{ 
}; 

Demo

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