Определение функции с двумя разными параметрами шаблона

#c #templates

#c #шаблоны

Вопрос:

У меня есть следующий код

 template< typename T>
struct S{
     T x,y;
     S(T a, T b) : x(a) , y(b) {}
};

using Di = S<int>;
using Dd = S<double>;

auto foo(Dd d){
          ..........
}
  

Теперь я сомневаюсь: предположим, я вызываю foo() с параметром типа Di , тогда это ошибка неправильного ссылочного типа.

Я знаю, что одним из решений является использование auto здесь, поскольку это работает. Но в целом я хочу знать, есть ли какой-либо другой метод, чтобы моя функция работала для обоих типов параметров.

Комментарии:

1. Это просто. Сделайте вашу функцию, саму по себе, шаблонной функцией.

Ответ №1:

Вы можете сделать функцию шаблоном:

 template<typename T>
auto foo(S<T> d){
  // ...
}
  

Теперь вы можете вызывать foo с любым экземпляром S .


Если вы хотите ограничить шаблон функции, чтобы он принимал экземпляры только S с помощью int или double , вы можете выполнить эту проверку внутри функции:

 
template<typename T>
auto foo(S<T> d){
  static_assert(std::is_same_v<T, int> || std::is_same_v<T, double>);
  // ...
}
  

Комментарии:

1. Вы также могли бы реализовать int foo(S<int> d) и double foo(S<double> d) напрямую.

2. @Homer6 Верно, но OP запросил функцию, поэтому написание 2 функций на самом деле не ответило бы на вопрос.

3. Возможно, вы правы. Но он также обычно спрашивал о любых других методах.

4. @Homer6 Это правда. Вы могли бы дать ответ, в котором перечислены некоторые параметры. Я бы хотел, чтобы мой ответ был коротким и по существу 🙂

5. Также @Homer6 для создания двух отдельных функций также является вариантом, но я знал это заранее, поэтому искал более конкретную.. Писать две разные функции для одной и той же задачи — пустая трата места … всегда спасибо за ответ … 🙂

Ответ №2:

S<int> и S<double> (также известные как Di и Dd ) — это два разных типа.

Точка.

Не имеет значения, что они являются экземплярами шаблона.

Итак, сделайте то, что вы обычно делаете, когда вам нужно, чтобы функция принимала аргумент одного из двух или более типов:

  • сделайте так, чтобы она принимала вариант, или
  • сделайте это шаблоном, или
  • написать перегрузку