#include <iostream>
using namespace std;
template<typename T>
void fun(const T & val)
{
cout << " T " << endl;
}
template<>
void fun<int>(const int & val)
{
cout << " specialization same code " << val << endl;
}
template<>
void fun<double>(const double& val)
{
cout << " specialization same code " << val << endl;
}
int main()
{
fun( 1 );
fun( 1.0 );
fun( 'c' );
return 0;
}
问题&GT;有没有办法可以重用功能专业化代码? 例如,假设'int'和'double'特化都具有完全相同的实现代码。有没有一种方法可以防止代码重复?
谢谢
答案 0 :(得分:3)
根据评论中@ 0x499602D2的建议,创建另一个函数并确保仅为int
或double
调用它。
template<typename T>
void bar(const T & val)
{
// Make sure this gets called only for int or double.
static_assert(std::is_same<T, int>::value || std::is_same<T, double>::value);
// Do useful stuff with val.
}
template<>
void fun<int>(const int & val)
{
bar(val);
}
template<>
void fun<double>(const double& val)
{
bar(val);
}
答案 1 :(得分:1)
要为同一类型的多种类型重复使用相同的代码,您可以使用std::enable_if
(或boost::enable_if
,如果您不使用C ++ 11)type traits(一个不错的例如here)。
e.g:
template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
fun(const T& val)
{
cout << " floating point specialisation " << val << endl;
}
(此类函数特化仅适用于C ++ 11,但您可以在旧C ++版本中使用结构或类用于相同目的)
答案 2 :(得分:0)
这样的东西可以给你你想要的重复使用水平:
#include <iostream>
#include <type_traits>
using namespace std;
// will only compile if T is an arithmetic type
template<typename T,
typename std::enable_if<
std::is_arithmetic<T>::value>::type* = nullptr>
void fun(T val)
{
cout << "the square is " << val * val << endl;
}
int main()
{
int x = 10;
double y = 10;
fun(x);
fun(y);
return 0;
}