我有一个元组列出了类的方法,如:
t = ('methA','methB','methC','methD','methE','methF')
Run Code Online (Sandbox Code Playgroud)
等等..
现在我需要根据用户选择动态调用这些方法.将根据索引调用这些方法.因此,如果用户选择"0",methA
则调用(如果为"5" methF
).
我这样做的方法如下:
def makeSelection(self, selected):
#methodname = t[selected]
#but as this is from within the class , it has to be appended with 'self.'methodname
# also need to pass some arguments locally calculated here
Run Code Online (Sandbox Code Playgroud)
我已经设法解决了一些事情,eval
但它产生错误并且一点也不优雅.
重写方法时关键字virtual会做什么?我没有使用它,一切正常.
在这方面,每个编译器的行为是否相同?
我应该使用它吗?
我发现以下方案延长了临时工作的寿命,我不知道是否应该,但确实如此.
struct S {
std::vector<int>&& vec;
};
int main() {
S s1{std::vector<int>(5)}; // construct with temporary
std::cout << s1.vec[0] << '\n'; // fine, temporary is alive
}
Run Code Online (Sandbox Code Playgroud)
但是,当S
给定显式值构造函数时,它不再是聚合,并且此方案失败并且读取无效s1.vec[0]
struct S {
std::vector<int>&& vec;
S(std::vector<int>&& v)
: vec{std::move(v)} // bind to the temporary provided
{ }
};
int main() {
S s1{std::vector<int>(5)}; // construct with temporary
std::cout << s1.vec[0] << '\n'; // not ok. invalid read on free'd memory
}
Run Code Online (Sandbox Code Playgroud)
为什么这对聚合有效?我认为它与构造函数是一个实际的函数调用有关,基于我使用const lvalue refs的红色.另外,有没有办法让后一种情况起作用?
在SO上使用左值引用处理类似情况有很多问题.我看到如果我使用了const lvalue ref,那么延长临时值的生命周期就无济于事了,rvalue refs的规则是否相同?
为什么构造函数(4)std::variant
来自http://en.cppreference.com/w/cpp/utility/variant/variant?似乎它会在代码中引起很多歧义,否则可以通过显式来避免.例如,cppreference上的代码示例突出显示用户可能不会注意到的可能的歧义(第三行)
variant<string> v("abc"); // OK
variant<string, string> w("abc"); // ill-formed, can't select the alternative to convert to
variant<string, bool> w("abc"); // OK, but chooses bool
Run Code Online (Sandbox Code Playgroud)
有些情况下绝对需要吗?
另一个问题是为什么需要从同一个cppreference页面构造函数(6)和(8).(5)和(7)不符合(6)和(8)的目的吗?我可能误解了他们的用法..
对于读者来说,我在问题中提到的构造函数是
constexpr variant(); // (1) (since C++17)
variant(const variant& other); // (2) (since C++17)
variant(variant&& other); // (3) (since C++17)
template< class T > // (4) (since C++17)
constexpr variant(T&& t);
template< class T, class... Args >
constexpr explicit variant(std::in_place_type_t<T>, Args&&... args); // (5) (since C++17)
template< class T, …
Run Code Online (Sandbox Code Playgroud) 我想从stdin读取一个数字.我不明白为什么scanf
要求在&
我的变量名称之前使用:
int i;
scanf("%d", &i);
Run Code Online (Sandbox Code Playgroud)
为什么scanf
需要变量的地址?
因此,有两种方法可以获取列表并将第二个列表的成员添加到第一个列表中.您可以使用列表连接,也可以迭代它.您可以:
for obj in list2:
list1.append(obj)
Run Code Online (Sandbox Code Playgroud)
或者你可以:
list1 = list1 + list2
Run Code Online (Sandbox Code Playgroud)
要么
list1 += list2
Run Code Online (Sandbox Code Playgroud)
我的问题是:哪个更快,为什么?我使用两个非常大的列表(超过10000个对象)对此进行了测试,似乎迭代方法比列表连接快得多(如l1 = l1 + l2).为什么是这样?谁能解释一下?
如何在Python中使用外部变量,比如extern int x;
在C中?
例如,
main1.py:
from myfunc import print_a
a = 10
print a
print_a()
Run Code Online (Sandbox Code Playgroud)
myfunc.py:
def print_a():
global a
print a
Run Code Online (Sandbox Code Playgroud) 我正在使用信号量,但我一直遇到未定义的参考警告,从而导致我的代码无法工作.我从文本中提取了示例代码,但是他们遇到了一些语法问题,所以我去了POSIX的信号量教程并改变了它们的语法,结果我现在得到了这些引用错误.
我可能只是忽略了一些东西,但我找不到它.
错误:
Producers_Consumers.c:52: warning: return type of ‘main’ is not ‘int’
/tmp/cceeOM6F.o: In function `producer':
Producers_Consumers.c:(.text+0x1e): undefined reference to `sem_init'
Producers_Consumers.c:(.text+0x3a): undefined reference to `sem_init'
Producers_Consumers.c:(.text+0x46): undefined reference to `sem_wait'
Producers_Consumers.c:(.text+0x52): undefined reference to `sem_wait'
Producers_Consumers.c:(.text+0x5e): undefined reference to `sem_post'
Producers_Consumers.c:(.text+0x6a): undefined reference to `sem_post'
/tmp/cceeOM6F.o: In function `consumer':
Producers_Consumers.c:(.text+0x7e): undefined reference to `sem_wait'
Producers_Consumers.c:(.text+0x8a): undefined reference to `sem_wait'
Producers_Consumers.c:(.text+0x96): undefined reference to `sem_post'
Producers_Consumers.c:(.text+0xa2): undefined reference to `sem_post'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我有什么(由于我从旧方法中评论出来的方式,它可能看起来有点难看)我也知道我的添加方法不起作用,但是当我修复语法问题时我会做到这一点:
#include <stdio.h>
#include …
Run Code Online (Sandbox Code Playgroud) 我惊讶地看到以下编译:
struct C {
operator C&&() {
std::cerr << "ref'd\n";
throw std::runtime_error("what is happening?");
}
};
Run Code Online (Sandbox Code Playgroud)
具有运算符的类型,用于其自身的rvalue-reference转换.但是,我无法使用我认为可以做到的操作来调用操作符.将值传递给采用右值引用的函数失败,并且调用std::move
对象不会触发任何操作.
为什么这段代码完全可以编译,有没有办法让这个函数运行?
clang给出warning: conversion function converting 'C' to itself will never be used
了或不带有关于类型的引用.
C++ 17更新:
static constexpr
变量是隐式的,inline
因此不需要外部定义.
原始问题:
假设我有一个常量列表,例如
struct Cls {
static constexpr int N = 32;
static constexpr int M = 64;
};
Run Code Online (Sandbox Code Playgroud)
这当然表明我为这些添加定义以避免可能发生的ODR使用问题,因此我需要:
constexpr int Cls::N;
constexpr int Cls::M;
Run Code Online (Sandbox Code Playgroud)
为什么要我喜欢这个了
struct Cls {
enum : int {
N = 32,
M = 64
};
};
Run Code Online (Sandbox Code Playgroud)
从而节省了我的ODR使用难题N
,M
并且更真实地只是常量而不是它们自己的对象(如果这只是标题,那就更大了)并且更短.enum : long long
如果需要,我可以明确指定类型或其他任何东西.第一个有什么优势?