我有这个方法
template <typename T>
T GetFnInput(){
//.... here is obtained void * t value from some library
return (T)(t);
}
我有几个针对不同类型的模板特化
template <>
uint32 GetFnInput<uint32>(){
return 0;
}
template <>
bool GetFnInput<bool>(){
return true;
}
但是,我需要一个专业作为引用。我试过这个(代码很乱,不应该在生产中使用,这只是为了我的测试目的):
template <typename T,
typename BaseT = std::decay<T>::type,
typename std::enable_if <std::is_reference<T>::value == true>::type* = nullptr >
T GetFnInput(){
BaseT * t = new BaseT();
return *t;
}
另外我添加了typename std::enable_if <std::is_reference<T>::value == false>::type* = nullptr >
到原件(上)GetFnInput()
但它不会编译,以错误结束:
error C2244: 'GetFnInput': unable to match function definition to an existing declaration
最佳答案
第一个问题是你错过了typename
这里:
typename BaseT = std::decay<T>::type,
^^^
一旦你有了它,你就会遇到第二个问题,那就是调用,比方说,GetFnInput<int&>()
在原始函数模板之间存在歧义GetFnInput<typename>
和这个新功能模板 GetFnInput<typename, typename, typename>
.这两个函数模板是彼此的重载,并且在其他方面是无关的。
通常您想要做的是将模板参数提升到参数列表中,以便更容易重载:
template <class T> struct tag { using type = T; };
template <class T>
auto get() -> decltype(get_impl(tag<T>{}))
{
return get_impl(tag<T>{});
}
然后你可以写你的get_impl
功能模板更容易。特定类型只是特定的重载:
uint32_t get_impl(tag<uint32_t> ) { return 0; }
引用类型只是一个模板:
template <class T>
T& get_impl(tag<T& > ) { ???; }
请注意,返回对已分配指针的引用听起来真是个坏主意。
关于C++ 模板方法特化以返回指针或引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40224646/