Явно создавать экземпляры шаблонов с помощью кортежа - PullRequest
0 голосов
/ 16 апреля 2020

Чтобы явно создать экземпляр шаблона класса, я могу сделать следующее:

//.h
template<typename T>
class Foo{};


//.cpp
template class Foo<float>;

Это хорошо, потому что класс Foo<float> нужно будет создать только один раз, когда он используется из многих мест. Можно ли было бы явно создать экземпляр Foo<T> с набором заранее определенных типов? Допустим, кортеж std::tuple<float, int, bool>, который я хочу использовать для создания экземпляров Foo<float>, Foo<int> и Foo<bool>

1 Ответ

0 голосов
/ 16 апреля 2020

Если вы хотите удобно создать несколько шаблонных классов Foo, вы можете просто предоставить оболочку для этого:

template<typename ...Ts>
class MultiFoo : public Foo<Ts>... {};

и затем создать несколько шаблонных классов одновременно:

template class MultiFoo<int, double, bool>;

, который будет создавать для вас Foo<int>, Foo<double> и Foo<bool>.

Вот демо 1014 *

Если у вас действительно есть кортеж, то Вы можете предоставить явную специализацию для этого:

template<typename ...>
class MultiFoo;

template<typename ...Ts>
class MultiFoo<tuple<Ts...>> : public Foo<Ts>... {};

и создать несколько Foo s с помощью:

template class MultiFoo<tuple<int,double, bool>>;

Вот демонстрационная версия , где я добавил свой собственный кортеж, так что вывод на самом деле виден. Это должно работать точно так же для std::tuple.

Обратите внимание, что если вы хотите явно создавать экземпляры шаблонов, чтобы они были видны в других единицах перевода, вам необходимо использовать ключевое слово extern для этого. например,

extern template class Foo<int>;

и

extern template class MultiFoo<int, double, bool>;
...