c++ - 模板函数特化默认

标签 c++ c++11 templates compiler-errors

<分区>

我正在尝试创建一个适用于特定数据类型的类,并且我希望在不支持数据类型时出现编译时错误。

我尝试像这样专门化模板。

template<>
float Foo::get<float>(const std::string& key)
{
    return std::stof(key);
}

并在泛型函数中放置一个 std::static_assert 因为我只需要指定的这些类型。

template<class T>
T Foo::get(const std::string&)
{
    static_assert(false, "unsupported data type");
    return T(0);
}

不幸的是,我得到了编译错误(静态断言失败),即使我有一个专门针对这种类型的函数。

我找到了一种只针对特定类型执行此操作的方法,但它看起来有点愚蠢而且不通用。

T Foo::get(const std::string&)
{
    static_assert(
            std::is_same<T,float>::value ||
            std::is_same<T,double>::value ||
            std::is_same<T,bool>::value ||
            std::is_same<T,uint32_t>::value ||
            std::is_same<T,int32_t>::value ||
            std::is_same<T,std::string>::value,
            "unsuported data type");
    return T(0);
}

最佳答案

您可以根据模板参数 T 创建 static_assert,然后在实例化之前不会对其进行评估,即探索确切类型的时间模板参数。例如

template<class T>
T get(const std::string&)
{
    static_assert(!std::is_same<T, T>::value, "unsupported data type");
    return T(0);
}

LIVE

关于c++ - 模板函数特化默认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44947410/

相关文章:

c++ - 如何确定进程是 32 位还是 64 位?

C++ libusb : how to send data to device?

c++ - 打印带 mustache 的笑脸 lambda 表达式

c++ - 如何在 C++ 中实现 "virtual template function"

c++ - 在 mac osx 上使用 gnu/c getline() 编译 c++ 代码?

c++ - 如何在 GMock 中使用带有测试夹具的模拟?

c++ - 在 C++ 中创建文件夹

c++ - 插入通用容器不起作用

c++ - 模板元编程 : (trait for? ) 将指定模板分解为类型 T<T2,T3 N,T4, ...>

c++ - 引号中定义的参数是什么