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

时间:2016-03-30 01:49:23

标签: c++11 overloading static-assert

当使用字符串文字调用成员函数A :: Get时,下面的代码将是static_assert,大概是因为重载命名解析的函数必须实例化模板,无论它是否被选中。

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'特化来停止断言,但是在其他情况下使用辅助类,并且在其他情况下专门用于'const char *'是没有意义的。

在这种情况下,有没有办法阻止helper :: type用'const char *'实例化?如果没有,有什么更好的方法来设计助手类以避免这个问题?

1 个答案:

答案 0 :(得分:0)

如果您只想停止使用Get实例化模板const char*方法,则可以使用std::enable_if。这样,您可以在T类型为const char*时禁用该功能。以下是使用Get的{​​{1}}方法的实现:

std::enable_if

这很长,但它避免了为template<typename T> typename helper<typename std::enable_if<!std::is_same<const char*, T>::value>::type>::type Get(T value) const { return value; } 案例专门化helper<T>。当const char*T时,它可以通过从重载解析中删除方法来实现。

您可以查看const char* here的文档。这两种类型都在<type_traits标题中。