【发布时间】:2018-11-28 16:17:16
【问题描述】:
我想根据函数是指针、引用还是常规类型来提供不同的函数实现。到目前为止,这是我的代码:
template<class T,
class = typename std::enable_if_t<std::is_reference<T>::value>>
void f(T && in)
{}
// This causes redefinition error
template<class T,
class = typename std::enable_if_t<std::is_pointer<T>::value>>
void f(T && in)
{}
template<class T,
class = typename std::enable_if_t<!std::is_reference<T>::value>,
class = typename std::enable_if_t<!std::is_pointer<T>::value>>
void f(T && in)
{}
中间函数原因:
12:13:错误:'template void f(T&&)'的重新定义
7:13:注意:'template void f(T&&)' 先前声明 这里
有趣的是只有第一个和最后一个函数一起编译。
关于如何修复它或简化此代码的任何想法。
【问题讨论】:
-
默认模板参数不是模板签名的一部分。所以这 3 个模板中,前两个具有相同的签名,而第三个采用 3 个模板参数。
-
为什么不只是重载
void f(T*)、void f(T&)和void f(T)? -
@NathanOliver:我如何将
void f(T&&)作为不转发参考?我的意思是我可以把整个过程倒过来,但不确定它是否会让事情变得更容易。 -
@AndreasPasternak 查看皮特·贝克尔的回答
-
@NathanOliver:你是对的!