在定义接口类时声明实例化方法的正确方法是什么?
出于显而易见的原因,抽象基类需要具有虚拟析构函数.但是,然后给出以下编译警告:"'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 …
尝试打印第一个命令行参数时:
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++
我经常遇到创建多态对象的数组或向量的需要.我通常更喜欢使用引用而不是智能指针来基类,因为它们往往更简单.
数组和向量被禁止包含原始引用,因此我倾向于使用指向基类的智能指针.但是,也可以选择使用std::reference_wrapper
:https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
从我从文档中可以看出,这是它的预期用途之一,但是当包含多态对象的数组的主题出现时,常见的建议似乎是使用智能指针而不是std::reference_wrapper
.
我唯一的想法是智能指针可能能够处理对象的整个生命周期吗?
TL:DR; 为什么智能指针,比如在创建多态对象数组时std::unique_ptr
看似偏好std::reference_wrapper
?
使用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。
我有一个类,允许创建包含任何类型或类的向量。不过,我想为数字类型添加附加功能。
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
使用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 ++ 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技巧可以实现这一点吗?
我想用它来设置常量表达式函数参数.
是否可以将给定类隐式转换为基本类型?特别是一个双.
如果我有课:
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)
如果有一种方法可以实现这种所需的功能,我认为它将通过运算符重载赋值运算符.或者可能以巧妙的方式定义移动/复制构造函数?
感谢您的任何见解.
我有一个矩阵类,我希望能够用括号列表初始化二维数据数组的值.我发现通过在调用构造函数之前声明一个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++ ×9
c++17 ×3
arrays ×2
clang++ ×2
templates ×2
c++14 ×1
casting ×1
clang ×1
cmake ×1
constexpr ×1
constructor ×1
double ×1
llvm ×1
llvm-clang ×1
polymorphism ×1
reference ×1