Как использовать шаблоны в C++ для вывода одного типа, зависящего от другого типа?

Как правильно получить конкретный тип данных Type с помощью другого типа T в качестве шаблонного аргумента? Я написал следующий код, но он не компилируется:

```cpp
template <typename T>
struct param_type_trait<int> {
  using Type = TYPE_A;
};

template <typename T>
struct param_type_trait<float> {
  using Type = TYPE_B;
};

template <class T>
void registrate_param(...) {
  auto param = new_shared<param_type_trait<T>::Type>();
  ...
}
```

Компилятор GCC выдает ошибку "template parameters not deducible in partial specialization". Подскажите, как исправить эту ошибку и сделать код работоспособным.
  • 14 февраля 2024 г. 17:58
Ответы на вопрос 3
Ошибка "template parameters not deducible in partial specialization" означает, что компилятор не может вывести или установить значение шаблонного параметра `T` в частичной специализации шаблона. В вашем коде у вас есть ошибки в определении шаблонов `param_type_trait`. Вместо `int` и `float` в качестве шаблонного параметра необходимо использовать `T`.

Вот исправленный код:

```cpp
template <typename T>
struct param_type_trait {
  using Type = TYPE_A; // если T - int
};

template <>
struct param_type_trait<float> {
  using Type = TYPE_B;
};

template <class T>
void registrate_param() {
  using ParamType = typename param_type_trait<T>::Type;
  auto param = new ParamType();
  // ...
}
```

Теперь шаблоны `param_type_trait` корректно определены, и код должен компилироваться без ошибок.

В функции `registrate_param` мы использовали `using` для определения псевдонима `ParamType`, который равен типу `Type` из `param_type_trait<T>`. Затем мы создаем экземпляр `ParamType`, используя оператор `new`.

Обратите внимание, что я также удалил `...` в определении функции `registrate_param`. Если у вас есть какие-то другие аргументы для этой функции, вы можете добавить их в определение.
Во-первых, есть if constexpr, во-вторых std::enable_if 

template <class T>
void registrate_param() {
    if constexpr (std::is_same_v<T, int>)
        auto param = make_shared<int>();
    else if (std::is_same_v<T, float>)
        auto param = make_shared<double>();
}
Ты можешь указать тип на прямую в шаблоне 
template<int T> void Test();
Похожие вопросы