Специализация черт

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
    Что должно произойти, если вы попытаетесь использовать Traits<TypeC>::storage ?
  • 1
    Ничто из того, что вы делаете в классе trait, не может удалить объявление переменной из main. Если вы фактически используете хранилище в другом классе (например, для переменной-члена), а не в main, вам нужно будет специализировать этот класс. В противном случае ваше объявление переменной ожидает тип, поэтому вы должны предоставить его (даже если это фиктивный тип).
Показать ещё 3 комментария
Теги:
typetraits

1 ответ

2
Лучший ответ

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

template<>
struct Traits<TypeC>
{
};

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

Другие примечания:

  • Вам нужна точка с запятой после struct декларацией/определения.
  • Шаблон ваших Traits (а не специализация) не должен иметь тела, если только он не имеет смысла для каждого типа. То есть, это должен быть template <typename> struct Traits; , Это приведет к его использованию с аргументом шаблона, который не имеет смысла приводить к ошибкам.
  • 0
    Но я не хочу ошибки, я просто не хочу, чтобы она что-то делала в случае TypeC. Потому что я намерен объявить переменную типа «хранилище» в другом классе.
  • 0
    @itachi Если вы не хотите, чтобы он что-то делал, тогда вам нужно разобраться с кодом, который использует черты. Вы не можете объявить переменную «без типа», поэтому вам нужно будет специализировать этот код в зависимости от того, существует ли тип хранилища. Вы можете использовать SFINAE для достижения этой цели.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню