在我的头文件中,我有一个函数
.str.replace('(', '').str.replace(']', '').str.replace(',', ' -')
它返回一个值,所以我可以调用
template<class T>
T Sum( T a, T b) const;
但我想也能够返回一个指针
auto x = Sum<int>( 10, 10 );
但是如何在头类和源文件中定义返回指针或值
auto y = Sum<int*>(10, 10 );
答案 0 :(得分:2)
没有简单的解决方案。类模板具有部分特化,它允许您专门处理所有指针类型。但功能只有完全专业化。你可以写
template <>
int* Sum<int*> (int a, int b)
{
int result = new int();
*result = a + b;
return result;
}
现在,类模板及其部分特化可以有一个静态方法,这是一种可行的解决方法。或者,使用std::enable_if
和std::is_pointer
来定义两个不相关的 Sum<>
模板,其中一个模板启用指针,另一个模板未启用指针。
答案 1 :(得分:1)
解决方案
#include <iostream>
// We need a new erase_pointer, because std::remove_pointer does not work
template< class T > struct erase_pointer {};
template< class T > struct erase_pointer<T*> {typedef T type;};
template <class T>
T Sum (T a, T b)
{
T result;
result = a + b;
return result;
}
template <class PT, class R>
PT Sum (R a, typename erase_pointer<PT>::type b)
{
typedef typename erase_pointer<PT>::type T;
PT result = new T();
*result = a + b;
return result;
}
int main(int argc, char **argv)
{
auto s1a = Sum(10,20);
auto s1b = Sum<int>(10,20);
auto s2 = Sum<int*>(10,20);
std::cout << s1a << ", " << s1b << ", " << *s2 << std::endl;
return 0;
}