gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:59 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com