只是一个简短的问题给出一个函数,我想返回一个基础类型enum class:
为什么这个版本工作正常
template<typename T>
constexpr inline
typename std::enable_if_t<
std::is_enum<T>::value,
typename std::underlying_type_t<T>
>
enumValue(T p_rVal) noexcept
{
return static_cast<typename std::underlying_type_t<T>>(p_rVal);
}
if (enumValue(myEnumClass) == 0) {}
Run Code Online (Sandbox Code Playgroud)
而这一个失败了" 找不到匹配的重载函数 "(VS 2015)错误:
template<
typename T,
typename std::enable_if_t<
std::is_enum<T>::value,
typename std::underlying_type_t<T>
>
>
constexpr inline
typename std::underlying_type_t<T>
enumValue(T p_rVal) noexcept
{
return static_cast<typename std::underlying_type_t<T>>(p_rVal);
}
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助!
我刚刚运行了 C++ requires关键字,想知道到目前为止我的理解是否正确:requires和enable_if都为模板提供编译时间约束。如果需要,将完全包含约束。
凡要求报价约束函数参数的方式,enable_if有限制编译时翻译模板类型本身的某些条件的主要目的。
例子:
#include <type_traits>
template<typename T>
concept T AdditiveGroup
{
return requires(const T pA, const T pB)
{
{ pA + pB }->T;
};
};
template<typename T>
typename std::enable_if<std::is_integral<T>::value, bool>::type
addElements(const T pA, const T pB)
{
return (pA + pB);
}
Run Code Online (Sandbox Code Playgroud)
在这里,当且仅当可以添加 pA 和 pB 时,该概念才起作用,而 enable_if 条件将评估限制为整数类型。
感谢您让我知道我是否做对了!
PS:我还不太确定require约束的语法,这似乎有所不同。此外,目前不知道哪个编译器接受它们,所以感谢您的任何提示!
考虑派生类的基类,其中基类应该为其所有派生提供一些(多态)方法,例如armithmetic或bitweise重载运算符.派生类不应修改此操作以确保正确执行.但是,与此同时,我想进行评估 - 在我的示例中函数isError() - 运算符必须是子类和纯虚拟的,因此必须定义:
class Mom
{
public:
virtual bool operator && (const Mom&) const final
{
return this->isError() && p_rOther.isError();
}
private:
virtual bool isError() = 0;
};
Run Code Online (Sandbox Code Playgroud)
鉴于当前标准,似乎不允许这样做,因为"纯虚拟性"意味着子类必须实现基类的所有虚函数,而"final"关键字与此范例相矛盾.
任何建议或想法如何处理这个矛盾?
c++ ×3
enable-if ×2
c++-concepts ×1
c++11 ×1
c++14 ×1
class ×1
constraints ×1
enums ×1
final ×1
overriding ×1
pure-virtual ×1
templates ×1