小编use*_*460的帖子

c ++接口必须遵守五条规则吗?

在定义接口类时声明实例化方法的正确方法是什么?

出于显而易见的原因,抽象基类需要具有虚拟析构函数.但是,然后给出以下编译警告:"'InterfaceClass'定义了一个非默认的析构函数,但没有定义复制构造函数,复制赋值运算符,移动构造函数或移动赋值运算符",这是"五的规则" ".

我理解为什么一般应该遵守"五规则",但是它仍适用于抽象基类或接口吗?

那么我的意思是:

class InterfaceClass
{
    //  == INSTANTIATION ==
  protected:
    //  -- Constructors --
    InterfaceClass()                      = default;
    InterfaceClass(const InterfaceClass&) = default;
    InterfaceClass(InterfaceClass&&)      = default;

  public:
    //  -- Destructors --
    virtual ~InterfaceClass() = 0;


    //  == OPERATORS ==
  protected:
    //  -- Assignment --
    InterfaceClass& operator=(const InterfaceClass&) = default;
    InterfaceClass& operator=(InterfaceClass&&)      = default;


    //  == METHODS ==
  public:
    // Some pure interface methods here...
};



//  == INSTANTIATION ==
//  -- Destructors --
InterfaceClass::~InterfaceClass()
{
}
Run Code Online (Sandbox Code Playgroud)

它是否正确?这些方法应该= delete …

c++ abstract-class rule-of-three virtual-destructor c++17

14
推荐指数
2
解决办法
841
查看次数

使用char**argv时如何避免指针运算

尝试打印第一个命令行参数时:

std::cout << argv[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)

clang-tidy发出警告:

警告:[cppcoreguidelines-pro-bounds-pointer-arithmetic]中的'不使用指针运算'

argv没有使用指针算法的替代方法来使用值?是不是char**通过任何明智的方法访问必须使用指针算术?

我欣赏有一些专门的函数来处理命令行参数,但它们似乎太重了,不能简单地打印一个参数.

我正在编写c++,使用clang编译器和构建cmake.

c++ pointer-arithmetic command-line-arguments clang-static-analyzer clang++

12
推荐指数
1
解决办法
2000
查看次数

多态对象的数组

我经常遇到创建多态对象的数组或向量的需要.我通常更喜欢使用引用而不是智能指针来基类,因为它们往往更简单.

数组和向量被禁止包含原始引用,因此我倾向于使用指向基类的智能指针.但是,也可以选择使用std::reference_wrapper:https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

从我从文档中可以看出,这是它的预期用途之一,但是当包含多态对象的数组的主题出现时,常见的建议似乎是使用智能指针而不是std::reference_wrapper.

我唯一的想法是智能指针可能能够处理对象的整个生命周期吗?

TL:DR; 为什么智能指针,比如在创建多态对象数组时std::unique_ptr看似偏好std::reference_wrapper

c++ arrays polymorphism reference smart-pointers

11
推荐指数
1
解决办法
1040
查看次数

Clang-Tidy llvm-header-guard目录配置

使用clang-tidy运行静态分析时,是否可以删除建议的llvm-header-guard字符串上的建议的计算机特定路径?

例如,文件(cls / math / matrix.hpp)的建议头保护为:_USERS_NAME_DESKTOP_PROJECT_SRC_CLS_MATH_MATRIX_HPP

但为避免使其特定于我的计算机,它应该仅为:_PROJECT_SRC_CLS_MATH_MATRIX_HPP

有没有一种方法可以配置clang-tidy,从而建议从/ project /目录而不是/ users /目录开始的头文件保护?

我正在使用从cmake运行的clang 5.0.0。

c++ include-guards llvm clang llvm-clang

8
推荐指数
1
解决办法
384
查看次数

多种类型的部分类模板专业化

我有一个类,允许创建包含任何类型或类的向量。不过,我想为数字类型添加附加功能。

template <>
class Vec<double> : public VecBase<double>
{
    //  == METHODS ==
    public:
        //  -- Constructors & Destructors --
        explicit Vec(const unsigned long long t_size);
        virtual ~Vec();

        //  -- Operators --
        friend Vec<double> operator+(const Vec<double>&, const double);

        //  -- Methods --
        double sum();

... etc.
Run Code Online (Sandbox Code Playgroud)

我已经部分专门化了类模板,以允许重载数学运算符以实现双重专门化。我现在也想将此专业化扩展到 int ,但不是复制专业化以 int 替换 double ,有没有办法将其添加到专业化列表中?

也就是说,有没有办法允许:

template<>
class Vec<double (or) int>
Run Code Online (Sandbox Code Playgroud)

干杯!

c++ templates operator-overloading partial-specialization template-specialization

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

无法在cmake 3.9.2中设置c ++标准(c ++ 17)

使用cmake(3.9.2)命令时:

set(CMAKE_CXX_STANDARD 17)
Run Code Online (Sandbox Code Playgroud)

没有正确添加标志-std = c ++ 17.

宏__cplusplus扩展到199711.我也遇到了关于c ++ 11功能的错误,比如initalization_lists.

我正在使用clang ++ 5.0.0.我也希望能够通过cmake使用clang-tidy:

set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=*")
Run Code Online (Sandbox Code Playgroud)

从版本3.7.1升级cmake后,这似乎只是一个问题.

我似乎无法找到有关版本之间相关更改的任何文档.我错过了什么吗?clang 5.0和cmake 3.9.2有一些兼容性问题吗?

谢谢.

c++ cmake clang++ c++17

6
推荐指数
0
解决办法
747
查看次数

模板非类型参数推导

是否有可能推导出c ++ 17函数的模板值(而不是类型)?

函数foo:

template<int I>
int foo()
{
    return (I);
}
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式调用

foo<5>();
Run Code Online (Sandbox Code Playgroud)

并将返回5.

模板类型可以通过函数参数的类型推断出来.是否可以以某种方式对模板值执行相同操作?例如:

template<int I = x>
int bar(const int x)
{
    return (I);
}
Run Code Online (Sandbox Code Playgroud)

这显然不会起作用(因为x在声明之前需要一个),但是可能会有一些C++ 17技巧可以实现这一点吗?

我想用它来设置常量表达式函数参数.

c++ templates constexpr template-argument-deduction c++17

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

从类到双精度的隐式转换

是否可以将给定类隐式转换为基本类型?特别是一个双.

如果我有课:

class Angle
{
    double value;

    Angle(double init_value = 0.0) : value(init_value) {}

    double get_value() const {return (value);}
}
Run Code Online (Sandbox Code Playgroud)

无论如何,我可以调用一个函数,比如std :: sin(),并提供一个Angle类对象,而不是每次调用都明确地得出angle的值?例如:

Angle theta(180.0);
double result = std::sin(theta);
Run Code Online (Sandbox Code Playgroud)

而不必通过以下方式调用std :: sin:

Angle theta(180.0);
double result = std::sin(theta.get_value());
Run Code Online (Sandbox Code Playgroud)

如果有一种方法可以实现这种所需的功能,我认为它将通过运算符重载赋值运算符.或者可能以巧妙的方式定义移动/复制构造函数?

感谢您的任何见解.

c++ double casting operator-overloading type-conversion

2
推荐指数
1
解决办法
328
查看次数

通过构造函数初始化类中的二维数组

我有一个矩阵类,我希望能够用括号列表初始化二维数据数组的值.我发现通过在调用构造函数之前声明一个2D数组,然后将其作为构造函数参数传递,我可以实现这一点.但是,我希望能够直接将括号列表作为参数传递.

template <class T, unsigned int N, unsigned int M>
class Matrix
{
    T data[N][M];

    Matrix(const T initMat[N][M])
    {
        for (unsigned int i=0; i<N; ++i)
        {
            for (unsigned int j=0; j<M; ++j)
            {
                data[i][j] = initMat[i][j];
            }
        }
    }
};




const double arr[2][2] = {{1.0,2.0},{3.0,4.0}};
Matrix<double, 2, 2> matA(arr);    // Valid


Matrix<double, 2, 2> matB({{1.0,2.0},{3.0,4.0}});    // Invalid
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个目标?我试过使用嵌套的std :: arrays无济于事(大概是因为它们的行为与c风格的数组相同).是否有可能通过初始化列表实现这一目标?(我尝试过使用init-lists,但我不确定它们是否不合适,或者它们是不是按照我的预期行事.)

我正在使用gcc和c ++ 14.

c++ arrays constructor initialization c++14

0
推荐指数
1
解决办法
403
查看次数