c++ - 指针作为函数返回类型的部分特化

标签 c++ templates c++11

我有一个模板包装函数,它返回一个像这样的值:

template<class T>
T foo(Bar& bar, const char* key) {
    return bar.value<T>(key);
}

但我希望它处理指针类型有点不同,像这样:

template<class T>
T foo(Bar& bar, const char* key) {
    return (T)bar.value<void*>(key);
}

这样我就可以:

int x = foo<int>(bar, "x");
Baz* b = foo<Baz*>(bar, "b");

像上面这样写显然会因为多个定义而出错。还有其他方法吗?我宁愿不要向每个使用指针的函数添加强制转换。

我试过以下方法:

template<class T>
T foo(Bar& bar, const char* key) {
    if(std::is_pointer<T>::value)
        return (T)bar.value<void*>(key);
    else
        return bar.value<T>(key);
}

但这也行不通,因为涉及到 QVariants 并且它们通过使用未知指针类型(bar.value<T>)实例化其模板函数之一而产生错误。

最佳答案

使用标记分派(dispatch)将调用委托(delegate)给辅助函数,这些辅助函数根据 T 是否为指针类型来执行不同的操作。

namespace detail
{
template<class T>
T foo(Bar& bar, const char* key, std::false_type /*not is_pointer*/) {
    return bar.value<T>(key);
}

template<class T>
T foo(Bar& bar, const char* key, std::true_type /*is_pointer*/) {
    return (T)bar.value<void*>(key);
}
}

template<class T>
T foo(Bar& bar, const char* key) {
    return detail::foo<T>(bar, key, std::is_pointer<T>{});
}

关于c++ - 指针作为函数返回类型的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30222659/

相关文章:

c++ - 我可以从ubuntu生成exe吗

c++ - 我在这里做 double 到 float 的转换吗

c++ - 如何去掉两个数的公约数

c++ - 使用基类的派生类中定义的类型

c++ - 替代模板变量?

c++11 - 在 C++11 中遍历 UTF-8 字符串

c++ - 8位BCD校验

javascript - 在node.js中运行页面特定的Javascript

c++ - 一个定义规则和模板类特化

c++ - 在编译时将类隐式转换为整数类型(最好是 bool)