小编aby*_*s.7的帖子

如何存储可变参数模板参数?

是否可以以某种方式存储参数包供以后使用?

template <typename... T>
class Action {
private:        
    std::function<void(T...)> f;
    T... args;  // <--- something like this
public:
    Action(std::function<void(T...)> f, T... args) : f(f), args(args) {}
    void act(){
        f(args);  // <--- such that this will be possible
    }
}
Run Code Online (Sandbox Code Playgroud)

然后是:

void main(){
    Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, 4);

    //...

    add.act();
}
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

79
推荐指数
3
解决办法
3万
查看次数

由不同编译器调用的不同强制转换操作符

考虑以下简短的C++程序:

#include <iostream>

class B {
public:
    operator bool() const {
        return false;
    }
};

class B2 : public B {
public:
    operator int() {
        return 5;
    }
};

int main() {
    B2 b;
    std::cout << std::boolalpha << (bool)b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果我在不同的编译器上编译它,我会得到各种结果.使用Clang 3.4和GCC 4.4.7打印true,而Visual Studio 2013打印false,这意味着它们调用不同的强制转换操作符(bool)b.根据标准,这是正确的行为?

在我的理解operator bool()需要转变,而operator int()将需要intbool转换,所以编译器应该选择第一个.是否const做一些与该是由编译器认为更"贵"常量转换?

如果我删除了const,所有编译器同样产生false输出.另一方面,如果我将两个类组合在一起(两个运算符将在同一个类中),则所有三个编译器都将生成true输出.

c++ language-lawyer

79
推荐指数
2
解决办法
2449
查看次数

如何在--gtest_filter中指定多个排除过滤器?

问题是谷歌测试框架.我想根据多个排除过滤器运行除排除一些测试之外的所有测试,例如: --gtest_filter=-ABC.*:-BCD.*

googletest

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

'git merge'如何在细节上工作?

我想知道'git merge'背后的确切算法(或接近那个).至少对这些子问题的答案将有所帮助:

  • git如何检测特定的非冲突变更的上下文?
  • git如何发现这些确切的行存在冲突?
  • git自动合并哪些东西?
  • 当没有合并分支的共同基础时,git如何执行?
  • 当合并分支有多个共同基础时,git如何执行?
  • 当我一次合并多个分支时会发生什么?
  • 合并策略有什么区别?

但是整个算法的描述会好得多.

git merge conflict

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

我真的需要为const对象实现用户提供的构造函数吗?

我有代码:

class A {
  public:
    A() = default;

  private:
    int i = 1;
};

int main() {
  const A a;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它在g ++上编译很好(参见ideone),但在clang ++上失败并出现错误:

const类型'const A'的对象的默认初始化需要用户提供的默认构造函数

我在LLVM错误跟踪器上报告了这个问题,并使其无效.

我认为试图说服铿锵的开发者绝对毫无意义.另一方面,我没有看到这种限制的原因.


任何人都可以建议,如果C++ 11标准以某种方式暗示此代码无效?或者我应该向g ++报告错误?或许在语言规则方面有足够的自由来以多种方式处理这些代码?

c++ constructor const language-lawyer c++11

42
推荐指数
2
解决办法
2858
查看次数

如何在python中按编号获取顶级protobuf枚举值名称?

例如,我有原始文件File.proto:

enum Test {
  ONE = 1;
  TWO = 2;
}
Run Code Online (Sandbox Code Playgroud)

File_pb2.py使用protoc 生成文件File.proto.我想在一个python代码中获取字符串"ONE"(对应于File_pb2.ONE的名称)的值为1(对应于File_pb2.ONE的值)来自生成的文件File_pb2.py而不定义我自己的字典.我怎样才能做到这一点?

python protocol-buffers

35
推荐指数
1
解决办法
3万
查看次数

关于隐藏符号被DSO引用的警告意味着什么?

我有一个问题链接一些共享库与g ++.它给了我一个警告:

hidden symbol XXX in YYY is referenced by DSO /usr/lib/...
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些关于特定问题的相关问题,但我想在整体上理解它 - 这个警告意味着什么,原因是什么:

  1. 什么是DSO?
  2. 什么是隐藏的符号?
  3. 如果被隐藏的话怎么引用呢?

c++ linker gcc shared-libraries elf

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

如何在C中创建具有特定权限的Unix Domain Socket?

我有一个简单的代码,如:

sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
unlink(path);

int fd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)(&address), sizeof(address));
listen(fd, 100);
Run Code Online (Sandbox Code Playgroud)

我想以原子方式创建具有特定权限的Unix Domain Socket文件,例如:0777.手册没有说明有关套接字文件权限的umask任何内容.甚至,如果umask确实影响了套接字文件,那么它不是一种原子方式 - 在多线程程序中.

我希望,有一种方法可以在不使用umask()调用同步的情况下实现我的目标.

c unix sockets umask unix-socket

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

如何在C++中显式调用异常抛出方法?

我有一个简单的课程:

class A {
 public:
  bool f(int* status = nullptr) noexcept {
    if (status) *status = 1;
    return true;
  }
  void f() {
    throw std::make_pair<int, bool>(1, true);
  }
};

int main() {
  A a;
  a.f(); // <- Ambiguity is here! I want to call 'void f()'
}
Run Code Online (Sandbox Code Playgroud)

我想通过任何方式解决方法调用的歧义,转而使用异常抛出方法.

这种界面背后的基本原理:

  • 拥有noexcept(true)noexcept(false)界面,
  • 允许通过noexcept(false)变量中的指针选择性地获取额外信息- 而noexcept(true)变体将始终将此信息打包在异常中.

有可能吗?建议您建立更好的界面.

c++ c++14

22
推荐指数
4
解决办法
3724
查看次数

有没有办法在声明中缩短C++ 11 lambda签名?

我想缩短以下类型的lambdas:

[] (SomeVeryLongTemplateType<int, float, char, std::string>, AnotherLongType) {};
Run Code Online (Sandbox Code Playgroud)

因为这个lambda的唯一原因是初始化一些类std::function<...>成员 - 它不捕获任何东西,它没有参数名称,它什么都不返回,它什么都不做.

如果缩短操作表示为签名中参数数量的函数,那么我希望此函数具有复杂度O(1).

有没有办法做到这一点?

c++ lambda syntactic-sugar c++11

21
推荐指数
2
解决办法
1152
查看次数