2014-11-10 1 views
0

Я хотел бы определить тип хранения внутри специализации. Но в некоторых случаях у меня нет ничего, чтобы действительно определить, т. Е. Не существует типа хранилища для определенных специализаций. Конечно, использование типа void не так, но я ищу что-то подобное. Я не уверен, что я направляюсь в правильном направлении - одним из способов может быть просто использование логического типа, поскольку оно занимает наименьшее пространство. Каким был бы правильный/хороший способ преодолеть это. Я не уверен, была ли задана такая проблема. Я не знал, что искать!Специализация специальности

template<typename T> 
struct Traits 
{ 
}  

template<> 
struct Traits<TypeA> 
{ 
    typedef std::vector<double> storage; 
}  

template<> 
struct Traits<TypeB> 
{ 
    typedef std::vector<string> storage; 
} 

template<> 
struct Traits<TypeC> 
{ 
    //I do not want to specify a storage type here. More like it does not exist. 
    //So what is the correct way to define such a type 
    typedef ??void?? storage; 
} 


int main() 
{ 
    typename Traits<TypeA>::storage myType; 
    /* 
    do domething 
    */ 
} 
+1

Что произойдет, если вы попытаетесь использовать «Черты :: storage'? –

+1

Ничто в классе признаков не может удалить объявление переменной из main. Если вы фактически используете хранилище в другом классе (например, для переменной-члена), а не внутри основного, вам нужно будет специализироваться на этом классе. В противном случае ваше объявление переменной ожидает тип, поэтому вы можете указать один (даже если это фиктивный тип). – Oguk

+0

@ T.C. Как сказал Огук, я намерен использовать тип хранилища в другом классе. – itachi

ответ

2

Просто опустить storage ЬурейеЕ, где это не имеет смысла:

template<> 
struct Traits<TypeC> 
{ 
}; 

Теперь использование Traits<TypeC>::storage становится ошибка, потому что он не называет тип.

Другие ноты:

  • Вы должны после запятой в struct декларации/определения.
  • Ваш шаблон Traits (не специализация) не должен иметь тела, если только он не имеет смысла для каждого типа. То есть, это должно быть template <typename> struct Traits;. Это приведет к его использованию с аргументом шаблона, который не имеет смысла приводить к ошибкам.
+0

Но я не хочу ошибка, я просто не хочу, чтобы она делала что-либо в случае TypeC. Потому что я намерен объявить переменную типа «тип хранилища» в другом классе. – itachi

+0

@itachi Если вы не хотите, чтобы он что-то делал, вам нужно взять это с кодом, который потребляет черты. Вы не можете объявить переменную типа «no type», поэтому вам нужно будет специализировать этот код на основе того, существует ли тип хранилища. Вы можете использовать SFINAE для этого. – cdhowie

+0

Точно (см. Мой комментарий ниже вопроса). Для этого вы специализируетесь на пользователе признака, а не на его признаке. – Oguk