C++ 模板方法特化以返回指针或引用

标签 c++ c++11 templates

我有这个方法

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/

相关文章:

c++ - 如何在 C++ 中异步执行一个函数?

c++ - 陷入无限循环(骑士之旅问题)

c++ - 在 qt 中将 QMAKE_CXXFLAGS += -std=c++11 添加到 .pro 文件不起作用(在 linux 12.04 上)

c++ - 模板的静态成员是全局唯一的吗?

C++ 为什么 "istringstream"在名称后使用括号?

c++ - 无法在终端中编译 C++ 项目

c++ - C++中具有构造函数的模板化typedef结构

c++ - Lambda`s internal this in c++

c++ - 解决 C++ 构造函数和调用歧义

c++ - 编译和评估 conditional_t 中的错误大小写问题