如何重用函数专业化代码?

时间:2014-11-24 20:37:25

标签: c++

#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'特化都具有完全相同的实现代码。有没有一种方法可以防止代码重复?

http://codepad.org/awGYWiWv

谢谢

3 个答案:

答案 0 :(得分:3)

根据评论中@ 0x499602D2的建议,创建另一个函数并确保仅为intdouble调用它。

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;
}