У меня есть вопрос о том, как правильно / правильно использовать шаблоны в C ++.
Допустим, у нас есть такой шаблонный класс:
template <typename T> class Foo
{
public:
T add(T n1, T n2);
};
template <typename T> T Foo<T>::add(T n1, T n2)
{
return(n1 + n2);
}
Это будет работать очень хорошос основными типами данных, такими как int, double, float, char ... и т. д.
Foo <int> foo_int;
std::cout << std::to_string(foo_int.add(2, 5)) << std::endl;
Foo <double> foo_double;
std::cout << std::to_string(foo_double.add(2.2, 6.1)) << std::endl;
Foo <char> foo_char;
std::cout << std::to_string(foo_char.add('A', 'm')) << std::endl;
Но это не очень хорошо работает со сложными типами данных, такими как этот:
class Bar
{
public:
std::string bar;
};
Bar bar_1;
Bar bar_2;
Foo <Bar> foo_bar;
std::cout << std::to_string(foo_int.add(bar_1, bar_2)) << std::endl;
Можно ли писать шаблоны, которые работают только с несколькими типами данных, или шаблоны следует использовать только в том случае, если они работают со всеми типами данных, такими как std :: vector.
В случае, если это правильнонаписать шаблоны, которые работают только для нескольких типов данных, как это должно быть написано?В случае класса Foo
я буду знать, что Foo
работает только с основными типами данных, но, скажем, я даю Алисе код Foo
, она этого не знает.Поэтому она получит ошибку компилятора, если она использует Foo
со сложными типами данных.
Можно ли сказать компилятору / программисту, что шаблоны работают только с определенными типами данных, за исключением ошибок, которые сгенерирует компилятор.