Нужен совет по дизайну ограничения типа в шаблоне класса в C ++, v11

Я хотел бы поместить ограничение типа POD на параметр типа T шаблона класса A а затем получить другой шаблон класса B от удовлетворительного A, Кроме того, B должен иметь различную реализацию в соответствии с постоянством экземпляра A, Цель всего этого, ну вы знаете, для лучшей проверки типов перед выполнением.

Все, что я могу понять, это предварительное определение A

template <typename T, typename POD=void>
class A;
template <typename T>
class A <T, std::enable_if<std::is_pod<T>::value>::type>
{
//blah...
};

так что A нельзя реализовать при передаче не-POD-типа, как вы могли заметить, что частичная параметризация работает как переключение типов.

Но я не могу понять, как можно определить B. Я полагаю, это выглядит следующим образом

template <typename A?>
class B;
template <>
B<const A?> : public A?
{
//blah...
};
template <>
B<A?> : public A?
{
//blah...
};

Любая блестящая идея?

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

0

Решение

Нет никакой блестящей идеи, если специализации будут совершенно другими. Вы должны пойти с этим:

template <typename T>
class B;

template <typename T>
class B<const A<T>> : public A<T>
{

};

template <typename T>
class B<A<T>> : public A<T>
{

};

который почти так же, как вы написали сами, кроме ? условное обозначение.

Вы можете создать этот класс как:

B<A<int>>       x; //it chooses the second specialization
B<const A<int>> y; //it chooses the first specialization

Увидеть онлайн демо. Обратите внимание, что вы забыли typename Вот:

typename std::enable_if<std::is_pod<T>::value>::type

Я тоже это исправил.

Если какой-то код в специализациях будет таким же, то вы могли бы сделать какой-то трюк, чтобы доля общая часть, но я не могу ничего предложить, потому что я не знаю, что вы собираетесь включить в специализации.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]