模板功能专用默认

时间:2017-07-06 11:17:48

标签: 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);
}

2 个答案:

答案 0 :(得分:1)

你可以做

template <typename> struct AlwaysFalse : false_type {};


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

因此断言取决于模板。

答案 1 :(得分:1)

您可以根据模板参数static_assert制作T,然后在实例化之前不会对其进行评估,即将精确类型作为模板参数进行探索的时间。 e.g。

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

LIVE