小编YiF*_*Fei的帖子

为什么我不能直接在临时对象上调用operator()?

我想做的事情可归纳为以下代码:

struct A{};

struct B{
    A& a;
    B(A& a) noexcept : a(a){}
    int operator()(int) {}
};

int main(){
    A a;
    B(a)(2);
}
Run Code Online (Sandbox Code Playgroud)

我的编译器(g++ 6)拒绝了代码抱怨a阴影参数.但是,如果我尝试显式调用operator(),它会按预期工作.

似乎g++忽略括号并将声明视为声明.

这是指定的还是预期的行为?

c++ compiler-errors g++ operator-keyword

16
推荐指数
1
解决办法
971
查看次数

如何从TypeList重建参数包

我有一个可变参数模板类型列表:

template <class... Types>
struct typelist {};
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能将它传递给一些需要参数包的外部代码呢std::tuple.换句话说,我需要将参数包存储为我的类型列表中的成员或typedef,如

...
struct typelist {
    using types = Types; // Imaginary syntax
}
Run Code Online (Sandbox Code Playgroud)

然而,编译器拒绝了这种情况,称类型未展开.

任何解决方法?

在这个问题的评论中以另一种方式提到了这个问题,但现有答案没有涵盖这个问题.


评论中要求的详细信息:

如果我编译(-std = c ++ 17):

template <class... T>
struct typelist {};

std::tuple<typelist<int, int>> tp{0,1};
Run Code Online (Sandbox Code Playgroud)

g ++给出 error: no matching function for call to ‘std::tuple<typelist<int, int> >::tuple(<brace-enclosed initializer list>)’ std::tuple<typelist<int, int>> tp{0,1};

如果我编译(-std = c ++ 17):

template <class... T>
struct typelist {
    using types = T;
};
Run Code Online (Sandbox Code Playgroud)

g++ …

c++ metaprogramming

7
推荐指数
1
解决办法
594
查看次数

在父类中公开受保护的构造函数

正如标题所说,我想知道是否有一种方法可以在派生类中公开受保护的构造函数(即,将访问权限从 更改protectedpublic)。考虑以下(人为的)示例:

struct A {
    int a;
    int b;
protected:
    A(int, int) {};
    void do_something();
};

struct B : A {
    B() : A(0, 0) {};
    using A::A;
    using A::do_something;
};

int main() {
    B b(0, 0); // error: 'A::A(int, int)' is protected
    //B b{}; // no errors
    b.do_something();
}
Run Code Online (Sandbox Code Playgroud)

那么可以更改受保护成员函数的访问权限,但不能更改构造函数的访问权限吗?如果是这样,限制的理由是什么?


变通方法:带有参数转发的可变参数模板可以作为一种执行相同的变通方法。


推测基本原理:默认情况下,基类的构造函数不是常规意义上的“继承”;派生类的构造函数必须首先构造基类实例。当using用于常规成员函数时,它将函数引入当前声明区域从而改变访问;在构造函数上,using只将基本构造函数带到“正常继承”级别(与没有 的其他成员函数相同using)。因为只有在某些情况下构造函数继承(基构造函数的重用)才有用,标准委员会的人指定using X::X了构造函数继承的语法,而不是更强的命名空间传送。

c++ inheritance encapsulation language-lawyer

7
推荐指数
1
解决办法
247
查看次数

Python:带有部分参数的map()

我有一个多参数函数。我简化了要映射的函数,这是我要测试的函数:

def _dist(I,J,X,Y):
    return abs(I-X)+abs(J-Y)
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我只想将X,Y保持不变,并分别在u_x和u_y上迭代I,J。我在下面写下一些东西(引发SyntaxError时)

new=map(_dist(,,cur.x(),cur.y()),u_x,u_y)
Run Code Online (Sandbox Code Playgroud)

其中cur.x()和cur.y()是恒定的。无论如何用map()做?

python

5
推荐指数
1
解决办法
446
查看次数

我可以从基于范围的元素中移动元素吗?

假设我有一些像这样的代码:

std::vector<std::string> produce(const std::string& str){
    // create a vector based on input
}

void consume(const std::string& str){
    for (auto i:produce(str))
        // do some thing that use the str
        // and I'd like to move it from the vector
        some_process(str) // for example, move into this function
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道编译器(我可能使用VS2015或gcc 6)是否可以优化以将元素移动到for循环中.或者我该怎么做才能让它进入,因为字符串可能非常冗长.

一个老人会开始为循环或协程提供帮助吗?

c++ move c++11

5
推荐指数
1
解决办法
1259
查看次数

Python:如何在打印中递归应用 __str__

我在容器中打印用户定义的类实例时遇到了一些问题。简而言之,如果我的代码是:

class A():
    def __str__(self):
        return 'abc'

class B():
    def __str__(self):
        return str(A())

a,b=A(),B()
C=[[a],b]
print(C)
Run Code Online (Sandbox Code Playgroud)

然后输出应该是:[[<__main__.A object at 0x02D99910>], <__main__.B object at 0x02DD5030>],但我希望它递归地应用自定义__str__并且即使在嵌套列表或类中也能工作,即我希望输出为[['abc'],'abc']. 任何pythonic方法?

python

4
推荐指数
1
解决办法
1490
查看次数

自定义分配器如何知道指针是否指向数组?

我可能误解了有关分配器的一些概念.但我真的不知道为什么我们需要std::size_t传递一个参数allocate来指示要分配的对象数.参数是用于分配内存区域,如数组还是向量?

如果是,那么我的自定义分配器如何知道先前返回的指针是指向某个区域还是仅指向某个对象?我的分配器是否有责任记录这些指针?

如果他们不是,那么为什么我们需要这个论点呢?

c++ allocator

4
推荐指数
1
解决办法
92
查看次数

在C语言语言的if语句中安排2乘2条件

编程时,我通常会将两组条件组合在一起,例如:

if (A && B){...}
else if (!A && B){...}
else if (A && !B){...}
else if (!A && !B){...}
Run Code Online (Sandbox Code Playgroud)

它也可以使用嵌套的if语句来解决.

if (A){
    if (B) {...}
    else {...}
}
else {
    if (B) {...}
    else {...}
}
Run Code Online (Sandbox Code Playgroud)

编辑:一些新的想法,我首先评估A和B并存储为临时变量(然后作为第一种方法)如果A和B的评估都没有副作用?


所以我的问题是它们之间的性能差异以及它们的可读性如何?

如果重要的话我用C++编写代码.

c c++

4
推荐指数
1
解决办法
104
查看次数

是否可以将模板的所有实例化类声明为相互的朋友?

假设我有一个模板(帮助器)类,我想让模板的所有实例化类都成为朋友(所以我可以隐藏一些静态成员函数作为私有,即使它们偶尔会在里面切换模板参数).

像这样:

template </* some types */>
class Foo {
    template </* same as above types */>
    friend class Foo</* template arguments */>;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译,因为gcc警告我,我正在专门化一些不允许的模板(必须出现在命名空间范围内).我不是想要专攻任何东西......

有什么办法吗?


最初,因为有很多参数,我试图使用可变参数模板来保存一些输入,但这被编译器认为是专门化的.虽然后来我切换回来键入所有参数,但是调用了显式特化(<>保留了).

非常原始的代码:

template <class... Ts>
friend class Foo<Ts...>;
Run Code Online (Sandbox Code Playgroud)

c++ templates friend

4
推荐指数
1
解决办法
206
查看次数

在Python中评估多个字符串相等的方便方法是什么?

我真的很难评估布尔表达式.看代码:

def f(A):
    if A=='a' or A=='b' or A=='c' ...:
        return True
    return False
Run Code Online (Sandbox Code Playgroud)

当A可以等于甚至更多的字符串时,有没有方便和优雅的方法来做到这一点?

python

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