我编写了以下代码,unique_ptr<Derived>其中使用了unique_ptr<Base>预期的a
class Base {
int i;
public:
Base( int i ) : i(i) {}
int getI() const { return i; }
};
class Derived : public Base {
float f;
public:
Derived( int i, float f ) : Base(i), f(f) {}
float getF() const { return f; }
};
void printBase( unique_ptr<Base> base )
{
cout << "f: " << base->getI() << endl;
}
unique_ptr<Base> makeBase()
{
return make_unique<Derived>( 2, 3.0f );
}
unique_ptr<Derived> makeDerived()
{ …Run Code Online (Sandbox Code Playgroud) 我想我非常理解如何将关键字constexpr用于简单的变量类型,但是当涉及到指向值的指针时,我感到很困惑.
我想声明一个constexpr C字符串文字,它的行为就像
#define my_str "hello"
Run Code Online (Sandbox Code Playgroud)
这意味着编译器将C字符串文字插入到我输入此符号的每个位置,并且我将能够在编译时使用sizeof获取其长度.
是吗 constexpr char * const my_str = "hello";
要么 const char * constexpr my_str = "hello";
要么 constexpr char my_str [] = "hello";
还是还有别的什么?
我正在解析二进制网络数据,我希望使该过程尽可能减少分配。但现在我意识到有两个非常相似的概念可能都足够适合我的情况,它们是std::basic_string_view<T>和std::span<T>。
所以我想知道。这两者之间有什么区别?使用其中一种比另一种有什么优势?一个明显的区别是可用性,std::basic_string_viewC++17 中已存在,而std::spanC++20 中已存在(但您可以使用“指南支持库”中的旧标准)。但还有别的事吗?应该如此,否则它们就不会同时进入标准。
想象一下,您有以下课程:
class A {
public:
virtual void print() { printf("A\n"); }
};
class B : public A {
public:
virtual void print() override { printf("B\n"); }
};
class C : public B {
// no override of print
};
Run Code Online (Sandbox Code Playgroud)
现在,如果您创建B的实例并调用print:
B * b = new B;
b->print();
Run Code Online (Sandbox Code Playgroud)
这个方法会被虚拟调用吗?换句话说,在编译时或运行时确定要调用的确切方法?
从理论上讲,它可以在编译时确定,因为我们知道,B的子类都不会覆盖该方法,所以无论我分配到指向B的指针B * b = new C; b->print();,它总是会调用B::print().
编译器是否也知道它并使我免于虚拟调用的不必要开销?
我有一个边加权无向图和 2 个节点(通常称为源和汇)。我需要找到一组最小可能权重的边,它将这 2 个节点分成 2 个弱组件。
\n\n我知道Ford-Fulkerson的最大流算法以及他的最大流和最小割关系定理以及他关于有向图上的
\n\n我还知道福特-富尔克森无向图最大流算法的修改,它将每个无向边替换为 2 个相反的有向边,并同时更新它们的流。但经过此修改,最大流最小割定理似乎不再有效,因为在以下无向图上,将无法正确确定最小割:
\n\nnodes: 0, 1, 2, 3\nedges & capacities: {0,1}->5, {0,2}->6, {1,2}->2, {1,3}->7, {2,3}->4\nsource: 0\nsink: 3\nRun Code Online (Sandbox Code Playgroud)\n\n最大流最小割定理说,最小割是那些流量等于其容量的边,而根据修改后的福特-富尔克森,这是所有边,这显然不是正确的割。
\n\n我找到了一个Stoer\xe2\x80\x93Wagner 算法,用于在无向图中查找全局最小割,但这不是我想要的,因为该算法不考虑任何源和汇,并且可以找到一个cut,这让节点位于同一个组件中。
\n\n是否有任何算法可以有效地在具有源和接收器的无向图中找到最小切割,将这两个指定的节点分开?\n我可以以某种方式修改前面提到的算法以使它们适用于我的情况吗?
\n是否有一种情况,当在UDP套接字上调用sendto()返回0时,如果是,那是什么意思?手动只说,错误时它是-1,否则它是发送的字节数.
我有一个QList自定义结构,我正在使用自定义模型类( 的子类QAbstractListModel)在一维 QListView 中显示这些结构。我已经覆盖了方法rowCount,flags并data从结构元素构造了一个显示字符串。
现在我想启用内部拖放功能,以便能够通过将它们拖放到其他项目之间来重新排序列表中的项目,但这项任务似乎非常复杂。我究竟需要覆盖什么以及我需要设置哪些参数?我尝试了很多东西,我试过了
view->setDragEnabled( true );
view->setAcceptDrops( true );
view->setDragDropMode( QAbstractItemView::InternalMove );
view->setDefaultDropAction( Qt::MoveAction );
Run Code Online (Sandbox Code Playgroud)
我试过
Qt::DropActions supportedDropActions() const override {
return Qt::MoveAction;
}
Qt::ItemFlags flags( const QModelIndex & index ) const override{
return QAbstractItemModel::flags( index ) | Qt::ItemIsDragEnabled;
}
Run Code Online (Sandbox Code Playgroud)
我尝试实施insertRowsand removeRows,但它仍然不起作用。
我还没有找到完全这样做的代码示例。官方文档非常深入地介绍了视图/模型模式的工作原理以及如何从外部应用程序或其他小部件进行拖放,但我不想要任何这些。我只需要简单的内部拖放操作来手动重新排序该列表视图中的项目。
有人可以帮帮我吗?否则我会因此而发疯。
编辑:根据要求添加 insertRows/removeRows 实现:
bool insertRows( int row, int count, const QModelIndex & parent ) override
{
QAbstractListModel::beginInsertRows( parent, row, row + …Run Code Online (Sandbox Code Playgroud) 我需要编写一个元编程构造,当给定枚举类型时,它将返回该枚举的基础类型,但是当给定整数时,它将返回该整数。
例如:
enum Enum : short { VALUE1, VALUE2 };
int_type<long>::type // -> long
int_type<Enum>::type // -> short
Run Code Online (Sandbox Code Playgroud)
我尝试了这个
template< typename Type >
struct int_type {
using type = typename std::enable_if< std::is_enum<Type>::value, typename std::underlying_type<Type>::type >::type;
};
template< typename Type >
struct int_type {
using type = typename std::enable_if< std::is_integral<Type>::value, Type >::type;
};
Run Code Online (Sandbox Code Playgroud)
但它抱怨重新定义该结构。
我也试过了,但是
template< typename Type >
struct int_type {
using type = typename std::enable_if< std::is_enum<Type>::value, typename std::underlying_type<Type>::type >::type;
using type = typename std::enable_if< std::is_integral<Type>::value, Type >::type;
};
Run Code Online (Sandbox Code Playgroud)
但随后它抱怨成员的重新定义 …
阅读有关 vector::resize 的手册http://www.cplusplus.com/reference/vector/vector/resize/
它只说明了尺寸更大或更小时会发生什么,但没有说明尺寸相等时会发生什么。是否保证在大小相同时不会重新分配数组并使迭代器无效?
我想避免一个分支并只处理 2 种情况(>= 或 <)而不是 3 种(< 或 > 或 ==),但如果未定义调整大小到相同大小,那么我也必须检查该情况。
我需要在C中执行一个真正的数学模.我有理由允许模数参数的负数,因为我的模块计算会产生负中间结果,必须将其放回到最少残留系统中.但是,我写道,允许负面模块是没有意义的
unsigned int mod( int x, unsigned int m )
{
int r = x % m;
return r >= 0 ? r : r + m;
}
Run Code Online (Sandbox Code Playgroud)
然而,使用负数和正模块调用此类函数
printf("%u\n", mod(-3, 11));
Run Code Online (Sandbox Code Playgroud)
产生输出
1
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.你能解释一下吗?
编辑:我知道运算符%与数学模数不同,我知道如何定义正数和负数.我问的是它会为不同的签名做些什么,而不是不同的标志.
我有一个函数用于不区分大小写的字符串比较,它std::lexicographical_compare与自定义比较器一起使用.
但是我想能够比较strings,string_views以及const char*相互之间,提供最大的便利和效率.
所以我在想:如果我制作模板,std::string有begin/ end,std::string_view有begin/ end,......但是const char*没有,甚至不是非成员函数的形式.
所以可以像这样定义自己的begin/ end重载
namespace std {
const char * begin(const char* str) { return str; }
const char * end(const char* str) { return str + strlen(str); }
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以比较一切了
std::lexicographical_compare(std::begin(a), std::end(a), std::begin(b), std::end(b), icomp );
Run Code Online (Sandbox Code Playgroud)
?
如果没有,我怎么能解决我的问题?
我所需要的只是能够以编程方式获取值,设置值,当然还允许用户通过写入字段或按箭头来设置值.MSDN对此非常麻烦,并没有提供足够的信息如何工作.在互联网的其他部分,没有代码可以做的工作示例.
我正在使用Windows 7中的MinGW编译程序,我需要它在Windows 7及更高版本上运行.无论是否使用程序Win32 API或MFC编写都没关系.
编辑: 经过一番讨论,我意识到我忘了指出重要的事实.我真的只是编写一个非常简单的应用程序,它将包含不超过3个小部件,我不打算将来使用Win32 API.因此,我没有理由学习所有这些特定于Windows的机制,并遵循MSDN强大的方法,使用资源文件中的自定义对话框定义或在内存中构建.
有没有办法,怎么做没有资源文件,自定义对话框类,并尽可能少的代码行?如何在现有窗口中直接创建一个spinbox以及我需要处理哪些消息?
我一直想知道这件事,并没有在任何地方找到相关的答案.你有什么线索,为什么C++标准委员会甚至不考虑在未来添加这样一个基本功能?在我看来,为了现在可以使用,每种编程语言都必须实现这些基本的东西:
我很高兴已经决定,C++ 11将至少具有线程,但这对于网络和文件系统来说是如此重要吗?我们都知道这是可能的,比如提升,所以为什么他们不能做出类似的东西呢?
c++ ×10
c ×2
string-view ×2
templates ×2
algorithm ×1
c-strings ×1
call ×1
constexpr ×1
containers ×1
enums ×1
filesystems ×1
graph-theory ×1
inheritance ×1
listview ×1
mod ×1
model-view ×1
modulo ×1
network-flow ×1
networking ×1
qt ×1
sendto ×1
signedness ×1
sockets ×1
standards ×1
string ×1
type-traits ×1
udp ×1
unique-ptr ×1
vector ×1
virtual ×1
winapi ×1
windows ×1