Я хотел бы поместить ограничение типа 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: Лично я, как правило, очень критичен. Но просто опубликуйте, как вы думаете, это можно сделать в любом случае.
Нет никакой блестящей идеи, если специализации будут совершенно другими. Вы должны пойти с этим:
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
Я тоже это исправил.
Если какой-то код в специализациях будет таким же, то вы могли бы сделать какой-то трюк, чтобы доля общая часть, но я не могу ничего предложить, потому что я не знаю, что вы собираетесь включить в специализации.
Других решений пока нет …