我有两个库可供使用,为方便起见,我在它们使用的某些类型/结构之间编写了一个转换器。

template<typename T>
struct unsupportedType : std::false_type
{};

template<typename T>
FormatB getFormat()
{
    static_assert(
        unsupportedType<T>::value, "This is not supported!");
}

template<>
FormatB getFormat<FormatA::type1>()
{
    return FormatB(//some parameters);
}

template<>
FormatB getFormat<FormatA::type2>()
{
    return FormatB(//some other parameters);
}

现在由于有了unsupportedType结构,编译器不会立即看到断言将始终失败,因此,如果未在某个地方未调用非专用版本的情况下,不会引发编译错误。但是,编译器因此也不知道static_assert之后的return语句是不必要的。我不只是想在断言之后放置一个任意的return语句来摆脱警告。

问题:什么是摆脱警告的干净方法?

最佳答案

我会尝试通过使用类似的方法来避免static_assert

template<typename T> FormatB getFormat()=delete;

然后,编译器作者可以致力于改进这些错误消息。

10-06 10:36