Как использовать шаблоны в 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 <br/> <br/> <pre><code class="cpp">template &lt;class T&gt;
void registrate_param() {
    if constexpr (std::is_same_v&lt;T, int&gt;)
        auto param = make_shared&lt;int&gt;();
    else if (std::is_same_v&lt;T, float&gt;)
        auto param = make_shared&lt;double&gt;();
}</code></pre>
Ты можешь указать тип на прямую в шаблоне <br/> <code class="cpp">template&lt;int T&gt; void Test();</code>
Похожие вопросы