小编Emi*_*ier的帖子

在C++中,为C API回调使用静态成员函数指针是安全/可移植的吗?

在C++中,为C API回调使用静态成员函数指针是安全/可移植的吗?静态成员函数的ABI是否与C函数相同?

c++ portability callback

26
推荐指数
3
解决办法
3545
查看次数

Fast Delegate(等)背后的想法是否用于优化std :: function?

已经提出了C++"委托"的建议,其开销低于boost::function:

是否已将这些想法用于实施std::function,从而产生更好的性能boost::function?有谁比较过std::functionvs 的表现boost::function

我想知道这个特别适用于英特尔64位架构上的GCC编译器和libstdc ++,但欢迎其他编译器的信息(例如Clang).

c++ performance boost c++11 std-function

22
推荐指数
1
解决办法
2788
查看次数

std :: reverse_iterator的缺点是什么?

boost的专用迭代器适配器的文档声明boost::reverse_iterator"纠正了C++ 98的std :: reverse_iterator的许多缺点."

这些缺点是什么?我似乎无法找到这些缺点的描述.

后续问题:

boost :: reverse_iterator如何纠正这些缺点?

c++ boost iterator stl

18
推荐指数
1
解决办法
1797
查看次数

在C++中,阴影变量名称的范围分辨率("优先顺序")是多少?

在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)

我想不出变量可能会发生冲突的任何其他范围.如果我错过了,请告诉我.

shadowbar成员函数内部时,所有四个变量的优先级顺序是多少?

c++ variables scope scope-resolution shadowing

16
推荐指数
2
解决办法
2611
查看次数

使用另一个命名空间中的typedef进行ADL

我有这样的事情:

#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 NMyPair(不幸)相关联.Afaik可能不会添加到命名空间std,所以如果我选择operator <<在std中定义那将是非法的.那么......在这种情况下该怎么办?我不想明确限定operator <<,也不想写using namespace N.所以,问题是:

  1. 如何重构代码?
  2. 为什么ADL不会关联typedef的名称空间?严重的原因?这会很好,例如在这种情况下.谢谢

c++ typedef argument-dependent-lookup

15
推荐指数
1
解决办法
1596
查看次数

使用Boost.Filesystem获取平台的路径分隔符

有没有办法使用Boost.Filesystem获取平台的路径分隔符?通过路径分隔符,我的意思/是Unix和\Windows.

我已经知道我可以使用boost::filesystem::path::operator/连接适当的分隔符来连接两个路径.但我只想要/或者\.

我也知道我可以使用#ifdef _WIN32,但我更喜欢Boost.Filesystem告诉我适当的分隔符.

编辑:我想使用Boost.Filesystem API的第3版,如Boost 1.48中所使用的.

c++ boost boost-filesystem

15
推荐指数
2
解决办法
2万
查看次数

嵌套的std :: arrays中的数据是否保证是连续的?

数据是否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吗?

编辑:为了清楚,对于这个例子,我希望整个矩阵的数据是连续的.

c++ multidimensional-array c++11

13
推荐指数
2
解决办法
1384
查看次数

允许类的用户移动私有成员

说我有这个班:

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类的用户提供移动有效负载的机会,而不是必须复制它.这样做最好的方法是什么?

我可以想到以下几种方式:

  1. 添加一个Payload& payload()返回可变引用的重载.用户可以这样做:

    Payload mine = std::move(message.payload())

  2. 不要假装我正在封装payload_,只是让它成为公共成员.

  3. 提供takePayload会员功能:

    Payload takePayload() {return std::move(payload_);}

  4. 提供此备用成员功能:

    void move(Payload& dest) {dest = std::move(payload_);}

  5. (由Tavian Barnes提供)提供payload使用ref-qualifier的getter重载:

    const Payload& payload() const {return payload_;} …

c++ encapsulation move c++11

13
推荐指数
1
解决办法
1439
查看次数

单身人士有哪些特定的合法用途?

可能重复:
在设计模式上:何时使用Singleton?

这个问题不是关于单身人士是否"被视为有害".我只是想知道,从你的经验,都有些什么具体情况,其中单身似乎运作良好.

编辑: 请,如果你想讨论单身的恰当性和/或邪恶一般,有已位于exising问题:137975,11831

哎呀!我刚刚发现我的问题已在这里被问到:关于设计模式:何时使用Singleton?

singleton design-patterns anti-patterns

10
推荐指数
2
解决办法
1199
查看次数

如何使用std :: valarray存储/操作连续的2D数组?

如何使用std::valarray存储/操作2D数组?

我想看一个2D数组的例子,其中的元素由行/列索引访问.像这样的伪代码:

matrix(i,j) = 42;
Run Code Online (Sandbox Code Playgroud)

如何初始化这样一个数组的例子也不错.

我已经知道Boost.MultiArray,Boost.uBlas和Blitz ++.

随意回答为什么我不应该使用valarray作为我的用例.但是,我希望多维数组的内存是连续的(列x行)块.没有Java风格的嵌套数组.

c++ multidimensional-array c++-standard-library

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