是否可以以某种方式存储参数包供以后使用?
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++程序:
#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()
将需要int
向bool
转换,所以编译器应该选择第一个.是否const
做一些与该是由编译器认为更"贵"常量转换?
如果我删除了const
,所有编译器同样产生false
输出.另一方面,如果我将两个类组合在一起(两个运算符将在同一个类中),则所有三个编译器都将生成true
输出.
问题是谷歌测试框架.我想根据多个排除过滤器运行除排除一些测试之外的所有测试,例如:
--gtest_filter=-ABC.*:-BCD.*
我想知道'git merge'背后的确切算法(或接近那个).至少对这些子问题的答案将有所帮助:
但是整个算法的描述会好得多.
我有代码:
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 ++报告错误?或许在语言规则方面有足够的自由来以多种方式处理这些代码?
例如,我有原始文件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
而不定义我自己的字典.我怎样才能做到这一点?
我有一个问题链接一些共享库与g ++.它给了我一个警告:
hidden symbol XXX in YYY is referenced by DSO /usr/lib/...
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些关于特定问题的相关问题,但我想在整体上理解它 - 这个警告意味着什么,原因是什么:
我有一个简单的代码,如:
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()
调用同步的情况下实现我的目标.
我有一个简单的课程:
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)
变体将始终将此信息打包在异常中.有可能吗?建议您建立更好的界面.
我想缩短以下类型的lambdas:
[] (SomeVeryLongTemplateType<int, float, char, std::string>, AnotherLongType) {};
Run Code Online (Sandbox Code Playgroud)
因为这个lambda的唯一原因是初始化一些类std::function<...>
成员 - 它不捕获任何东西,它没有参数名称,它什么都不返回,它什么都不做.
如果缩短操作表示为签名中参数数量的函数,那么我希望此函数具有复杂度O(1).
有没有办法做到这一点?