考虑:
struct B {
void f();
private:
B(int, int = 0);
};
struct D : B { using B::B; };
void B::f() {
auto a = D{0};
auto b = D(0);
auto c = D(0, 0);
D x{0};
D y(0);
D z(0, 0);
}
Run Code Online (Sandbox Code Playgroud)
GCC 接受(从 7.1 开始;以前拒绝所有)。Clang 接受bandxyz但拒绝aand c。MSVC 在 C++14 模式下拒绝所有,但在 C++17 模式下接受所有。
哪些编译器是正确的?C++14 和 C++17 之间的规则是否发生了变化——如果是这样,为什么在 C++14 中B::f不允许访问它自己的构造函数(命名为 via D)?为什么 Clang 只接受(函数式)强制转换 atb而不是列表初始化 at …
每(优秀)质询C++输出迭代增量后的要求,我们观察到,对于一提领和递增的值r的OutputIterator类型X,和值o适当类型的,所述表达
*r++ = o;
Run Code Online (Sandbox Code Playgroud)
是有效的,并具有相同的语义
X a(r);
++r;
*a = o;
Run Code Online (Sandbox Code Playgroud)
但是,a如果r在中间期间增加不止一次,那么仍然可以解除引用吗?也就是说,这段代码有效吗?
X a(r);
++r;
++r;
*a = o;
Run Code Online (Sandbox Code Playgroud)
很难看出对值的操作如何影响对另一个值的操作的有效性,但是例如InputIterator(24.2.3)在以下条件下的后置条件下++r:
之前的任何值的副本
r都不再需要可解除引用或属于其中==.
相关章节:24.2.2迭代器,24.2.4输出迭代器,17.6.3.1模板参数要求.
此外,如果这不是必须有效的,是否有任何情况下利用其无效性将有助于类型的实现(wrt效率,简单性),OutputIterator同时仍然遵守现有要求?
假设,我想开发一个通用库,它应该可以用于类似数字的类型,包括双重和用户定义的类型.我现在面临的问题是,我不知道如何编写函数模板的返回类型,就像这样:
template<class T>
auto transmogrify(T x)
-> ???
{
using std::abs;
return abs(x)+2.0;
}
Run Code Online (Sandbox Code Playgroud)
using声明使这个函数模板的主体适用于原始类型,因为它们没有关联的命名空间(因此没有ADL).但是我希望transmogrify使用专门的abs函数,以防用户定义类型的作者提供自己的abs函数.我不能简单地使用
-> decltype( abs(x)+2.0 )
Run Code Online (Sandbox Code Playgroud)
因为这不适用于比赛,因为std :: abs不在范围内(据我所知).但写作
-> decltype( std::abs(x)+2.0 )
Run Code Online (Sandbox Code Playgroud)
会禁用ADL.但禁用ADL不是一种选择.此外,专用abs函数返回的值可能不是T类型,而是某些其他类型.
关于如何解决返回类型问题的任何想法,同时(a)保持ADL和(b)回退到某些默认函数(如本例中的std :: abs),对于不提供专用abs的类型.
c++ generic-programming decltype argument-dependent-lookup c++11
我有一个python类,其中包含一些列表和变量(在中初始化__init__)。
我想有一个对这个特定实例数据进行操作并返回一个新实例(新数据)的方法。最后,此方法应返回一个具有修改后数据的新实例,同时保留原始实例的数据不变。
什么是Python的方式来做到这一点?
编辑:
我在类中有一个方法,该方法以complement()特定方式修改数据。我想添加一个__invert__()方法,该方法返回带有complement()ed数据的类的实例。
示例:假设我有一个类
A。a
= A()
a.complement()将修改实例a中的数据。
b =〜a将使实例中的数据保持不变,但b将包含complement()数据。
假设我有一个通过其闭包递归的函数:
def outer():
def fact(n):
return 1 if n == 0 else n * fact(n - 1)
return fact
Run Code Online (Sandbox Code Playgroud)
我现在想序列化该函数并使用以下命令重建它types.FunctionType:
import pickle, marshal, copyreg, types
def make_cell(value):
return (lambda: value).__closure__[0]
def make_function(*args):
return types.FunctionType(*args)
copyreg.pickle(types.CodeType,
lambda code: (marshal.loads, (marshal.dumps(code),)))
copyreg.pickle(type((lambda i=0: lambda: i)().__closure__[0]),
lambda cell: (make_cell, (cell.cell_contents,)))
copyreg.pickle(types.FunctionType,
lambda fn: (make_function, (fn.__code__, {}, fn.__name__, fn.__defaults__, fn.__closure__)))
buf = pickle.dumps(outer())
fn = pickle.loads(buf)
Run Code Online (Sandbox Code Playgroud)
这对于普通闭包来说效果很好,但是当尝试在其闭包内进行序列化fact时,它会导致无限递归。处理递归数据结构的通常方法是在构造和初始化之间记忆对象,但对象是不可变的,如(元组)和单元对象:picklefactpicklefunctionfn.__closure__
>>> cell = (lambda i=0: lambda: i)().__closure__[0]
>>> …Run Code Online (Sandbox Code Playgroud) 我有这个设置:
文件:a.ext1 a.py
a.ext1由于某种原因加载a.py,但作为引擎,我需要加载文件a.ext1.
我可以在py3中使它正常工作,但我无法在py2中使用它.
这是我的python2尝试:**这是主要的流程,当然还有更多的代码.
file = os.path.abspath(os.path.expanduser('a.ext1')
directory = os.path.dirname(file)
sys.path.append(directory)
fullname = 'my.name.space.a'
sys.modules['my.name.space'] = imp.new_module('my.name.space')
x = imp.load_source(fullname,file)
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样做; x,它会告诉我:
module 'my.name.space' from '<path>/a.ext1'
Run Code Online (Sandbox Code Playgroud)
但如果我做dir(x),它会给我a.py的东西.我希望它能从a.ext1文件中提供给我的东西.
我怎样才能在py2上运行?
以下是它在py3上的工作原理:
file = os.path.abspath(os.path.expanduser('a.ext1'))
directory = os.path.dirname(file)
sys.path.append(directory)
fullname = 'my.name.space.a'
loader = importlib.machinery.SourceFileLoader(fullname = fullname,
path = file)
x = loader.load_module()
Run Code Online (Sandbox Code Playgroud)
现在x正是我想要的,a.ext1文件,而不是.py
知道如何让这个为py2工作吗?
(顺便说一句,我已经阅读了关于Stack溢出这个主题的所有内容,但从来没有.py也存在的情况)
我有一个git控制目录(实际上是我的主目录),其中有被忽略的目录(例如垃圾空间和其他VCS控制的目录).我希望能够让我的bash提示符显示目录是否受版本控制,如果是,则由哪个VCS控制,但是例如git rev-parse总是找到最顶层的.git目录.
有没有办法问git我是否在一个未跟踪的目录中?
我发现这个工作:
if ! git rev-parse 2>&/dev/null; then
echo "not in git"
else
PREFIX=$(git rev-parse --show-prefix)
if [ -z "$PREFIX" ]; then
echo "at git top level"
elif [ -z $(cd $(git rev-parse --show-toplevel); \
git ls-files -o --directory "${PREFIX%%/}")
echo "tracked by git"
else
echo "untracked"
fi
fi
Run Code Online (Sandbox Code Playgroud)
然而,它似乎非常hackish和脆弱.有没有更好的办法?
给定一系列项目和另一个块长度序列,如何将序列拆分为所需长度的块?
a = range(10)
l = [3, 5, 2]
split_lengths(a, l) == [[0, 1, 2], [3, 4, 5, 6, 7], [8, 9]]
Run Code Online (Sandbox Code Playgroud)
理想情况下,解决方案既适用于两者a,也适用l于一般的迭代,而不仅仅是列表.
我有一个上下文装饰器,它完成后会产生副作用.我注意到如果我使用字典理解,就不会出现副作用.
from contextlib import contextmanager
import traceback
import sys
accumulated = []
@contextmanager
def accumulate(s):
try:
yield
finally:
print("Appending %r to accumulated" % s)
accumulated.append(s)
def iterate_and_accumulate(iterable):
for item in iterable:
with accumulate(item):
yield item
def boom_unless_zero(i):
if i > 0:
raise RuntimeError("Boom!")
try:
{i: boom_unless_zero(i) for i in iterate_and_accumulate([0, 1])}
except:
traceback.print_exc()
print(accumulated)
print('\n=====\n')
try:
{i: boom_unless_zero(i) for i in iterate_and_accumulate([0, 1])}
except:
traceback.print_exc()
print(accumulated)
print('Finished!')
Run Code Online (Sandbox Code Playgroud)
输出:
$ python2 boom3.py
Appending 0 to accumulated
Traceback (most recent call last): …Run Code Online (Sandbox Code Playgroud) 我在 BitBucket 上分叉了一个仓库:
$ hg paths
default = https://bitbucket.org/mine/project
upstream = https://bitbucket.org/theirs/project
Run Code Online (Sandbox Code Playgroud)
现在我想将我的存储库的(本地)状态与其上游进行比较。使用 git 我只是写git diff --stat upstream/master origin/master,但 hg 似乎不接受远程分支名称作为参数:
$ hg diff --stat upstream/default default/default
default/default: No such file or directory
upstream/default: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我猜我可能可以将其指定为revset,但我无法正确使用语法,并且找不到任何示例。
问题Mercurial - 比较本地和远程存储库?看起来相关,但这只是显示了本地和远程状态之间的差异;我想看看远程状态和它所分叉的上游远程之间的区别。