在C++中,为C API回调使用静态成员函数指针是安全/可移植的吗?静态成员函数的ABI是否与C函数相同?
已经提出了C++"委托"的建议,其开销低于boost::function:
是否已将这些想法用于实施std::function,从而产生更好的性能boost::function?有谁比较过std::functionvs 的表现boost::function?
我想知道这个特别适用于英特尔64位架构上的GCC编译器和libstdc ++,但欢迎其他编译器的信息(例如Clang).
boost的专用迭代器适配器的文档声明boost::reverse_iterator"纠正了C++ 98的std :: reverse_iterator的许多缺点."
这些缺点是什么?我似乎无法找到这些缺点的描述.
后续问题:
boost :: reverse_iterator如何纠正这些缺点?
在C++中,阴影变量名称的范围分辨率("优先顺序")是多少?我似乎无法在网上找到简明的答案.
例如:
#include <iostream>
int shadowed = 1;
struct Foo
{
Foo() : shadowed(2) {}
void bar(int shadowed = 3)
{
std::cout << shadowed << std::endl;
// What does this output?
{
int shadowed = 4;
std::cout << shadowed << std::endl;
// What does this output?
}
}
int shadowed;
};
int main()
{
Foo().bar();
}
Run Code Online (Sandbox Code Playgroud)
我想不出变量可能会发生冲突的任何其他范围.如果我错过了,请告诉我.
shadow在bar成员函数内部时,所有四个变量的优先级顺序是多少?
我有这样的事情:
#include <iostream>
namespace N
{
typedef std::pair<int, double> MyPair;
std::ostream& operator << (std::ostream& o, MyPair const & mypair)
{
///
}
}
int main()
{
N::MyPair pr;
std::cout << pr;
}
Run Code Online (Sandbox Code Playgroud)
这自然不起作用,因为ADL找不到operator<<因为namespace N与MyPair(不幸)相关联.Afaik可能不会添加到命名空间std,所以如果我选择operator <<在std中定义那将是非法的.那么......在这种情况下该怎么办?我不想明确限定operator <<,也不想写using namespace N.所以,问题是:
有没有办法使用Boost.Filesystem获取平台的路径分隔符?通过路径分隔符,我的意思/是Unix和\Windows.
我已经知道我可以使用boost::filesystem::path::operator/连接适当的分隔符来连接两个路径.但我只想要/或者\.
我也知道我可以使用#ifdef _WIN32,但我更喜欢Boost.Filesystem告诉我适当的分隔符.
编辑:我想使用Boost.Filesystem API的第3版,如Boost 1.48中所使用的.
数据是否std::array<std::array<T,N>, M>保证是连续的?例如:
#include <array>
#include <cassert>
int main()
{
enum {M=4, N=7};
typedef std::array<char,N> Row;
typedef std::array<Row, M> Matrix;
Matrix a;
a[1][0] = 42;
const char* data = a[0].data();
/* 8th element of 1D data array should be the same as
1st element of second row. */
assert(data[7] == 42);
}
Run Code Online (Sandbox Code Playgroud)
断言保证成功吗?或者,换句话说,我可以依靠在结尾处没有填充Row吗?
编辑:为了清楚,对于这个例子,我希望整个矩阵的数据是连续的.
说我有这个班:
class Message
{
public:
using Payload = std::map<std::string, boost::any>;
Message(int id, Payload payload)
: id_(id),
payload_(std::move(payload))
{}
int id() const {return id_;}
const Payload& payload() const {return payload_;}
private:
int id_;
Payload payload_;
};
Run Code Online (Sandbox Code Playgroud)
Payload复制的地方可能很大而且价格昂贵.
我想给这个Message类的用户提供移动有效负载的机会,而不是必须复制它.这样做最好的方法是什么?
我可以想到以下几种方式:
添加一个Payload& payload()返回可变引用的重载.用户可以这样做:
Payload mine = std::move(message.payload())
不要假装我正在封装payload_,只是让它成为公共成员.
提供takePayload会员功能:
Payload takePayload() {return std::move(payload_);}
提供此备用成员功能:
void move(Payload& dest) {dest = std::move(payload_);}
(由Tavian Barnes提供)提供payload使用ref-qualifier的getter重载:
const Payload& payload() const {return payload_;} …
可能重复:
在设计模式上:何时使用Singleton?
这个问题不是关于单身人士是否"被视为有害".我只是想知道,从你的经验,都有些什么具体情况,其中单身似乎运作良好.
编辑: 请,如果你想讨论单身的恰当性和/或邪恶一般,有已位于exising问题:137975,11831
哎呀!我刚刚发现我的问题已在这里被问到:关于设计模式:何时使用Singleton?
如何使用std::valarray存储/操作2D数组?
我想看一个2D数组的例子,其中的元素由行/列索引访问.像这样的伪代码:
matrix(i,j) = 42;
Run Code Online (Sandbox Code Playgroud)
如何初始化这样一个数组的例子也不错.
我已经知道Boost.MultiArray,Boost.uBlas和Blitz ++.
随意回答为什么我不应该使用valarray作为我的用例.但是,我希望多维数组的内存是连续的(列x行)块.没有Java风格的嵌套数组.
c++ ×9
boost ×3
c++11 ×3
callback ×1
iterator ×1
move ×1
performance ×1
portability ×1
scope ×1
shadowing ×1
singleton ×1
std-function ×1
stl ×1
typedef ×1
variables ×1