static_assert 在函数名称解析期间触发

static_assert triggering during function name resolution

下面的代码会static_assert在调用成员函数A::Get时使用字符串字面量,估计是因为函数重载命名解析无论是否选中都必须实例化模板

template<typename T>
struct helper
{
    static_assert(std::is_integral<T>::value, "Must be integeral type");

    typedef T type;
};

class A
{
public:
    A()
    {}

    std::string Get(const char* value) const
    {
        return std::string(value) + " (non-template)";
    }

    template<typename T>
    typename helper<T>::type Get(T value) const
    {
        return value;
    }
};

我可以通过添加 'helper' 特化来停止断言,但是在其他情况下会使用助手 class,并且特化 [=19= 没有意义] 在其他情况下。

在这种情况下,有什么方法可以阻止 helper::type 被 'const char*' 实例化吗?如果不是,设计助手 class 以避免此问题的更好方法是什么?

如果您只想阻止模板化的 Get 方法被 const char* 实例化,您可以使用 std::enable_if。这样,当 T 的类型为 const char* 时,您可以禁用该功能。这是使用 std::enable_if:

实现您的 Get 方法
template<typename T>
typename helper<typename std::enable_if<!std::is_same<const char*, T>::value>::type>::type Get(T value) const
{
    return value;
}

它很长,但它避免了为 const char* 情况专门化 helper<T>。当 Tconst char*.

时,它通过从重载解析中删除方法来工作

您可以查看 std::is_same here. Both types are in the <type_traits header 的文档。