他の人が提案するように、おそらくテンプレートを使用する必要があります。
template <class T>
return_type func(T const& l, T const& r)
{
...
}
通常、ジェネリック関数によって実装された操作が特定の型に対して意味をなさない場合にコンパイルを失敗させたいため、条件付き定義を使用します (以下の例では is_arithmetic):
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
template <class T>
typename boost::enable_if<boost::is_arithmetic<T>, return_type>::type
func(T const& l, T const& r)
{
...
}
またはコード内の静的アサーションで同じ結果が得られます。
#include <boost/type_traits/is_arithmetic.hpp>
template <class T>
return_type func(T const& l, T const& r)
{
static_assert(boost::is_arithmetic<T>::type::value, "incompatible types");
...
}