Тип сгруппированный Явное создание шаблонов - PullRequest
0 голосов
/ 20 января 2019

Если у меня есть шаблонный класс с перегруженными функциями-членами шаблона (с использованием SFINAE), например:

template <typename T>
struct Foo{
    Foo(T elem);

    template <typename U = T>
    auto get() -> std::enable_if_t<std::is_same_v<U, int>, U>;
    template <typename U = T>
    auto get() -> std::enable_if_t<std::is_same_v<U, bool>, U>;
    T elem_;
};

Теперь в моем файле CPP я должен определить и явно создать экземпляр:

template class Foo<int>;
template int Foo<int>::get<int>();
template class Foo<bool>;
template bool Foo<bool>::get<bool>();
// For all types...T, there will be two statements.

Каковы различные возможные способы группирования по типу - что-то вроде:

GroupedFooInit<int>(); // does both Foo<int> and Foo<int>::get<int>
GroupedFooInit<bool>(); // similar
.. and so on.

Учитывая, что я вынужден использовать C ++ 14, 2 обходных пути, которые я мог бы придумать, но не хотел / хотел:
1. Macros: возможно, но хотелось бы сильно избегать.
2. Definition in header, no explicit instantiation needed: Возможно, но я работаю над огромным репозиторием, где файл, с которым я имею дело, в значительной степени включен везде - поэтому мои сборочные периоды огромны, если я пойду по этому пути даже для незначительных изменений.

Ссылка на фрагмент кода

1 Ответ

0 голосов
/ 20 января 2019

Вы можете решить проблему, добавив слой:

template <typename T>
struct Foo{
  Foo(T elem);

  T elem_;

  T get(){
     return do_get<T>();
     }

  private:

  template <typename U = T>
  auto do_get() -> std::enable_if_t<std::is_same<U, int>::value, U>;

  template <typename U = T>
  auto do_get() -> std::enable_if_t<std::is_same<U, bool>::value, U>;
   };
//If definitions for the do_get functions are provided before these
//explicit template instantiation definitions, the compiler will certainly
//inline those definitions.
template class Foo<int>;
template class Foo<bool>;
...