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>
。当 T
为 const char*
.
时,它通过从重载解析中删除方法来工作
您可以查看 std::is_same
here. Both types are in the <type_traits
header 的文档。
下面的代码会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>
。当 T
为 const char*
.
您可以查看 std::is_same
here. Both types are in the <type_traits
header 的文档。