c++ - 具有模板特化的通用类型转换

标签 c++ templates types c++17 template-meta-programming

我正在努力编写一个用于类型转换的通用接口(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_referencestd::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/

相关文章:

c++ - 使 std::vector 分配对齐的内存

c++ - 为什么无符号和有符号相减后符号不同?

c++ - 为什么模板类的内联静态变量未初始化?

templates - 升级到 underscore 1.7 时出现模板错误

c++ - 内置数组大小的类型是多少?

haskell - 由于使用 'minBound' 无法推断(有界 a1)

go - 如何直接将Podio AuthToken传给podio-go客户端

c++ - OpenGL 中 DirectX 文件的骨骼动画

c# - 将类型转换为通用约束 T

c++ - GDB 断点在 asio socket->connect 调用后停止工作