这是因为const DATA_TYPE& newValue
它将匹配几乎任何东西,在你的情况下它匹配为对指针的引用const DATA_TYPE*& newValue
。尝试使用std::remove_pointer
这里描述的 - 从我的头顶我会写:
template<typename DATA_TYPE>
void Push(const typename std::remove_pointer<DATA_TYPE>::type& newValue)
{
//do stuff
}
template<typename DATA_TYPE>
void Push(const DATA_TYPE *newValue)
{
//do stuff
}
然而,编写const T&
与其他模板重载匹配的模板通常会导致const T&
每次调用都被抓取,因此您应该避免以这种方式做事。
编辑 :
我之前的代码不正确,它必须更复杂一点:
#include <iostream>
#include <type_traits>
template<typename DATA_TYPE, bool is_pointer>
struct helper;
template<typename DATA_TYPE>
struct helper<DATA_TYPE, true>{
static void f(const typename std::remove_pointer<DATA_TYPE>::type*){
std::cout << "Pointer" << std::endl;
}
};
template<typename DATA_TYPE>
struct helper<DATA_TYPE, false>{
static void f(const DATA_TYPE&){
std::cout << "Non-pointer" << std::endl;
}
};
template<typename DATA_TYPE>
void Push(const DATA_TYPE& newValue)
{
helper<DATA_TYPE, std::is_pointer<DATA_TYPE>::value >::f(newValue);
}
int main()
{
int i=0;
Push(i);
Push(&i);
return 0;
}
这可以按预期工作,并且不会强制调用者使用适当的 const-ness,尽管我承认它不像我以前的解决方案那样迷人;)