Частичная специализация шаблонного класса на нетиповом аргументе - PullRequest
1 голос
/ 23 марта 2020

Я пишу класс, который представляет тип. Я хочу два варианта класса:

Proxy<SomeType> something;

, который инициализирует something конструктором по умолчанию, и:

Proxy<SomeType, SomeValue> something;

, который инициализирует something с SomeValue.

Вторая форма может быть определена как:

template<typename T, T init>
class Proxy {...};

Я не могу понять, как написать специализацию «без инициализатора».

1 Ответ

1 голос
/ 23 марта 2020

Использовать пакет параметров T значений в основном шаблоне. В первом пакете специализации пусто, во втором - только одно значение инициализации:

template<class T, T ...>
struct Proxy;

template<class T>
struct Proxy<T> {
    void foo() { std::cout << "no init value" << std::endl; }
};

template<class T, T Value>
struct Proxy<T,Value> {
    T mVal{Value};
    void foo() { std::cout << mVal << std::endl; }
};

int main()  {
    Proxy<int> f;
    Proxy<int,123> f2;
    f.foo();  // no init value
    f2.foo(); // 123

Демо

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