Единственный способ ограничить шаблон - сделать так, чтобы он использовал что-то из нужных вам типов, чего нет у других типов.
Итак, вы создаете с помощью int, используете + и + =, вызываете конструктор копирования и т. Д.
Любой тип, который имеет все это, будет работать с вашей функцией - поэтому, если я создам новый тип, который имеет эти функции, ваша функция будет работать с ним - что здорово, не правда ли?
Если вы хотите ограничить это больше, используйте больше функций, которые определены только для того типа, который вы хотите.
Еще один способ реализовать это - создать шаблон признаков - что-то вроде этого
template<class T>
SumTraits
{
public:
const static bool canUseSum = false;
}
А затем специализируйте его на классах, с которыми вы хотите, чтобы все было хорошо:
template<>
class SumTraits<int>
{
public:
const static bool canUseSum = true;
};
Тогда в своем коде вы можете написать
if (!SumTraits<T>::canUseSum) {
// throw something here
}
edit: как уже упоминалось в комментариях, вы можете использовать BOOST_STATIC_ASSERT, чтобы сделать его проверкой во время компиляции вместо проверки во время выполнения