假设我们有以下(无意义)代码:
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) 我想要一个接受不同类型参数的泛型函数(或方法).如果提供的类型具有"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,我会更高兴.最好的情况是:使用第一个模板,如果失败则使用第二个模板.
检查方法存在只是一个例子.我真正想要的还是检查与其他类的兼容性.
任务可以改写:
我的问题是,为什么以下代码无法编译:
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++ 限制或编译器错误。
我想使用 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 不可能做到这一点,那么您有什么建议?我更喜欢最简单的解决方案。
我想在样式表本身的前缀中更改输出中的前缀.
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和取消前缀输出元素来解决,但它不是一个选项.要输出的元素必须具有样式表中提供的前缀,只有在输出中才能更改它们.
我有一行单词的列表:
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。
我正在使用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".
c++ ×3
bash ×2
templates ×2
gcc ×1
inheritance ×1
lambda ×1
llvm-clang ×1
makefile ×1
optimization ×1
regex ×1
sed ×1
sfinae ×1
split ×1
type-traits ×1
typedef ×1
xml ×1
xslt ×1