模板按值返回,指针以cpp / h为单位

时间:2016-08-12 23:10:42

标签: c++ templates c++11

在我的头文件中,我有一个函数

.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 );

2 个答案:

答案 0 :(得分:2)

没有简单的解决方案。类模板具有部分特化,它允许您专门处理所有指针类型。但功能只有完全专业化。你可以写

template <>
int* Sum<int*> (int a, int b)
{
  int result = new int();
  *result = a + b;
  return result;
}

现在,类模板及其部分特化可以有一个静态方法,这是一种可行的解决方法。或者,使用std::enable_ifstd::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;
}

https://ideone.com/xt2nyT