小编haa*_*ael的帖子

C++编译器是否对lambda闭包执行编译时优化?

假设我们有以下(无意义)代码:

const int a = 0;
int c = 0;
for(int b = 0; b < 10000000; b++)
{
    if(a) c++;
    c += 7;
}
Run Code Online (Sandbox Code Playgroud)

变量'a'等于零,因此编译器可以在编译时推断出指令'if(a)c ++;' 将永远不会被执行,并将优化它.

我的问题:lambda闭包会发生同样的情况吗?

查看另一段代码:

const int a = 0;
function<int()> lambda = [a]()
{
    int c = 0;
    for(int b = 0; b < 10000000; b++)
    {
        if(a) c++;
        c += 7;
    }
    return c;
}
Run Code Online (Sandbox Code Playgroud)

编译器是否会知道'a'是0并且它会优化lambda吗?

更复杂的例子:

function<int()> generate_lambda(const int a)
{
    return [a]()
    {
        int c = 0;
        for(int b = …
Run Code Online (Sandbox Code Playgroud)

c++ optimization lambda gcc llvm-clang

10
推荐指数
1
解决办法
1025
查看次数

C++模板专业化 - 避免重新定义

我想要一个接受不同类型参数的泛型函数(或方法).如果提供的类型具有"one"方法,则该函数应使用它.如果它有'两个'方法,该函数应该使用它.

这是无效的代码:

#include <iostream>

template<typename Type> void func(Type t)
{
    t.one();
}

template<typename Type> void func(Type t) // redefinition!
{
    t.two();
}

class One
{
    void one(void) const
    {
        std::cout << "one" << std::endl;
    }
};

class Two
{
    void two(void) const
    {
        std::cout << "two" << std::endl;
    }
};

int main(int argc, char* argv[])
{
    func(One()); // should print "one"
    func(Two()); // should print "two"
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用SFINAE?是否可以使用type_traits?


澄清:

如果可以使用SFINAE,我会更高兴.最好的情况是:使用第一个模板,如果失败则使用第二个模板.

检查方法存在只是一个例子.我真正想要的还是检查与其他类的兼容性.

任务可以改写:

  1. 如果该类支持第一个接口,请使用它.
  2. 如果第一个接口出现故障,请使用第二个接口.
  3. 如果两者都失败,则报告错误.

c++ templates sfinae type-traits template-specialization

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

为什么类级别的 typedef 不从模板继承?

我的问题是,为什么以下代码无法编译:

template<typename t> class c1
{
public:
    typedef int type_name;
    void fn1(type_name x) {}
};

template<typename t> class c2 : public c1<t>
{
public:
    void fn2(type_name x) {}
};
Run Code Online (Sandbox Code Playgroud)

虽然以下内容确实如此:

class c1
{
public:
    typedef int type_name;
    void fn1(type_name x) {}
};

class c2 : public c1
{
public:
    void fn2(type_name x) {}
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,唯一的区别是在第一种情况下,类是模板。Gcc 和 Clang 抱怨 type_name 没有在第二个类中定义(仅在模板版本中)。typedef不是从父类继承的吗?如果是这样,为什么它可以在非模板版本上工作?使用模板中的 typedef 时是否存在异常?

另外,我知道我可以使用完全限定的类型名称(即“typename c1::type_name”)来完成这项工作。我只是想知道这是否是一些 C++ 限制或编译器错误。

c++ inheritance templates typedef

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

使用 sed 重复每一行

我想使用 sed 复制输入的每一行。即当输入看起来像:

first
secod
third
fourth
...
Run Code Online (Sandbox Code Playgroud)

我希望输出看起来像:

first first
second second
third third
fourth fourth
... ...
Run Code Online (Sandbox Code Playgroud)

等等。

如果使用 sed 不可能做到这一点,那么您有什么建议?我更喜欢最简单的解决方案。

regex bash sed

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

XSLT中的别名前缀(不是命名空间)

我想在样式表本身的前缀中更改输出中的前缀.

XSLT文件:

<stylesheet version="1.0" xmlns:a="nsA">
 <template match="/">
  <a:out/>
 </template>
</stylesheet>
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

<a:out xmlns:a="nsA" />
Run Code Online (Sandbox Code Playgroud)

我想要的是:

<b:out xmlns:b="nsA" />
Run Code Online (Sandbox Code Playgroud)

请注意,我只想更改前缀,而不是命名空间.元命名空间别名将仅转换命名空间,保留前缀不变.

如果可以完全删除前缀,则可以获得奖励积分:

<out xmlns="nsA" />
Run Code Online (Sandbox Code Playgroud)

请注意,XSLT元素没有前缀,输出元素是前缀.它必须保持这样.我知道问题可以通过前缀XSLT和取消前缀输出元素来解决,但它不是一个选项.要输出的元素必须具有样式表中提供的前缀,只有在输出中才能更改它们.

xml xslt transformation xml-namespaces

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

重击:将行拆分为多行

我有一行单词的列表:

aaaa bbbb ccc dddd
eee fff ggg hhh
iii jjj kkk
Run Code Online (Sandbox Code Playgroud)

我想要每个单词放在单独的行中:

aaaa
bbbb
ccc
dddd
eee
fff
ggg
hhh
iii
jjj
kkk
Run Code Online (Sandbox Code Playgroud)

如何在字符最少的 bash中做到这一点?最好没有awk。

bash split

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

Makefile:为一个构建步骤设置env var

我正在使用GNU make和Makefiles.是否可以为一个构建步骤设置环境变量?

目前我正在做这样的事情:

VAR:=valueA
step1:
    echo $(VAR)
Run Code Online (Sandbox Code Playgroud)

然后,"make step1"将打印"valueA".

是否有可能为一个构建步骤重新定义env var?

VAR:=valueA
step1:
    echo $(VAR)
step2:
    VAR:=valueB
    echo $(VAR)
Run Code Online (Sandbox Code Playgroud)

我想"make step1"打印"valueA",但是"make step1"打印"valueB".

makefile environment-variables

0
推荐指数
1
解决办法
1654
查看次数