当使用字符串文字调用成员函数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 *'实例化?如果没有,有什么更好的方法来设计助手类以避免这个问题?
答案 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
标题中。