我正在努力编写一个用于类型转换的通用接口(interface)。我更愿意通过模板特化来实现这一点。我的想法是有一个基本模板实现来抛出异常,即在没有可用的特化的情况下。用户应该提供所有可能的转换。
我有一个小实现,当然它不起作用:)
#include <iostream>
#include <functional>
template <typename T, typename F>
T convert(const F & from)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
throw ( std::logic_error("Conversion not implemented!") );
}
template<>
int convert<int, std::string >( const std::string & from) {
return 1;
}
int main() {
int a;
std::string b = "hello world";
const std::string &br = b;
a = convert<decltype(a), std::remove_reference_t<std::remove_const_t<decltype(br)>> >(br);
std::cout << a << std::endl;
return 0;
}
我不明白为什么上面的代码不起作用。我正在从 br
中删除 const 和引用,因此它应该调用已实现的特化,但事实并非如此。我期待您的积极回复,以及是否有更有效的方法来调用转换 API,而无需在模板参数中指定类型。
问候, -阿德南
最佳答案
I am removing const and reference from the br
是的,但是顺序错误。
删除 const 之前和引用之后;您应该删除之前的引用和之后的 const
// ......................................................VVVVVVVVV reference before
a = convert<decltype(a), std::remove_const_t<std::remove_reference_t<decltype(br)>> >(br);
// ..................................^^^^^ const after
重点是decltype(br)
是 std::string const &
;我的意思是:const
仅适用于std::string
,而不是std::string &
.
相反,引用适用于 std::string const
.
所以当你申请std::remove_const
时至std::string const &
,你又得到 std::string const &
,因为完整类型不是 const
.
接下来您申请std::remove_reference
至std::string const &
你得到 std::string const
.
所以const
留下来。
如果您先使用std::remove_reference
,来自std::string const &
您获得std::string const
.
然后你使用std::remove_const
(这次有效,因为完整类型是 const
),您会得到 std::string
.
关于c++ - 具有模板特化的通用类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58998935/