понимание определения шаблона на основе политики - PullRequest
2 голосов
/ 20 декабря 2011
template <
    typename T,
    template <class> class OwnershipPolicy = RefCounted, #1
    class ConversionPolicy = DisallowConversion,         #2
    template <class> class CheckingPolicy = AssertCheck,
    template <class> class StoragePolicy = DefaultSPStorage
>
class SmartPtr;

Q1 > Каков синтаксис для строки # 1

template <class> class OwnershipPolicy = RefCounted,

, почему она не предоставляет такой параметр, как следующий?

template <class T2> class OwnershipPolicy = RefCounted,

Q2 > В чем разница между # 1 и # 2 ?

template <class> class OwnershipPolicy = RefCounted,

class ConversionPolicy = DisallowConversion,

Почему одна из этих строк имеет template<class> а другой нет?

1 Ответ

4 голосов
/ 20 декабря 2011

template <class> class OwnershipPolicy - аргумент шаблона шаблона.Т.е. ожидается, что OwnershipPolicy будет шаблоном, принимающим один (и только один) аргумент типа.У этого аргумента нет названия, потому что он не нужен, и вы все равно не сможете его использовать.

class ConversionPolicy эквивалентно typename ConversionPolicy, то есть любому аргументу обычного типа.

Разница заключается в том, как вы его используете.Для аргументов шаблона вы указываете только имя шаблона, которое вы можете использовать позже для создания конкретных типов.Для typename вам нужен конкретный тип:

template <typename A, template <typename> class B>
struct foo {};

template <typename T>
struct x {};

struct y {};

template <typename T, typename U>
struct z {};

// both of these are valid:
foo<x<int>, x> a;
foo<y, x> b;
// these are not:
foo<y, x<int>> c;
foo<y, y> d;
foo<y, z> e; // z has two template arguments, B must have only one

Стоит отметить, что эта идиома называется «разработка на основе политики».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...