我有一个模板包装函数,它返回一个像这样的值:
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/