小编gil*_*ash的帖子

c ++ std :: enable_if约束变体和问题

只是一个简短的问题给出一个函数,我想返回一个基础类型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++ enums class enable-if c++14

6
推荐指数
1
解决办法
303
查看次数

C++ 约束 enable_if vs requires

我刚刚运行了 C++ requires关键字,想知道到目前为止我的理解是否正确:requiresenable_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约束的语法,这似乎有所不同。此外,目前不知道哪个编译器接受它们,所以感谢您的任何提示!

c++ templates constraints enable-if c++-concepts

5
推荐指数
1
解决办法
2359
查看次数

C++覆盖最终和纯虚方法

考虑派生类的基类,其中基类应该为其所有派生提供一些(多态)方法,例如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++ overriding final pure-virtual c++11

-1
推荐指数
1
解决办法
2934
查看次数