我从C ++ 17了解到,借助推论指南,可以从例如初始化中推导std :: vector的模板参数:
std::vector vec = { function_that_calculate_and_return_a_specifically_templated_type() }
Run Code Online (Sandbox Code Playgroud)
但是,我现在不想编译和运行代码的机器上没有C ++ 17的支持。
C ++ 11是否有任何可能的解决方法?如果存在更多解决方案,那么最好的解决方案就是保持代码的可读性。
目前,我唯一的想法是跟踪代码中的各种情况(幸运的是,它们不应太多)并进行一些显式的typedef / using。
任何建议都非常欢迎
我最近在用 Lua 编程,厌倦了编写一些代码,比如
if variable ~= nil then
variable.function()
end
Run Code Online (Sandbox Code Playgroud)
我知道在 C# 或 Swift 中,我们可以做类似的事情
variable?.function()
Run Code Online (Sandbox Code Playgroud)
Lua 有一些方法来实现这种功能吗?
到目前为止,我已经考虑过传递和调用一个可调用的
template <class Fct, class... Args> void f(Fct&& g, Args&&... args)
{
g(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
是要走的路.现在在这个演讲中(在34分钟)和std :: invoke示例实现中,我看到了上述片段的等价性,它在调用它之前有条件地将可调用对象转换为右值引用,
template <class Fct, class... Args> void f(Fct&& g, Args&&... args)
{
std::forward<Fct>(g)(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
我假设这个修改只会影响闭包,但我仍然不明白为什么第二个版本更可取:强制转换仅影响rvalue参数,并且在调用时不应复制任何状态,对吗?我还检查了std :: function :: operator()是否被重载&并&&获得了上述代码段替代库的提示,但事实并非如此.
在此先感谢您的提示和答案!
以下代码无法编译。Clang给出以下错误信息:
candidate function not viable: no known conversion from 'A' to 'A &&' for 1st argument
好像a里面f()是一个左值。
struct A{};
void g(A&& a){
return;
}
void f(A&& a){
g(a);
}
int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是合理的,因为防止多次f()调用g()。
以下将修复我的代码:
g(std::move(a));
Run Code Online (Sandbox Code Playgroud)
不过看上去错我:想会发生什么,如果有人修改了签名f()来void f(A& a)。
有更好的成语吗?
假设我有一个 C++20 模板 lambda:
auto foo = []<bool arg>() {
if constexpr(arg)
...
else
...
};
Run Code Online (Sandbox Code Playgroud)
但是我怎么称呼它呢?我似乎找不到语法的描述。我尝试了通常的foo<true>();and template foo<true>();,但 gcc 似乎都不喜欢。
我有一个关于类声明与类定义的快速问题。
因此,我可以想到四种不同的类代码方案:
哪些符合声明,哪些符合定义?为什么?
TIA。
1)
class foo_empty{};
Run Code Online (Sandbox Code Playgroud)
2,3)
class foo_NoMemDef{
int f1(); //Member function declaration(?), no body
//int i; (consider including this as a separate case 3)
};
Run Code Online (Sandbox Code Playgroud)
4)
class foo_final{
int f2(){}
};
Run Code Online (Sandbox Code Playgroud) 我有以下代码
static constexpr bool condition = true;
int square(int num) {
if constexpr (condition) {
return num * num;
} else {
x
return num;
}
}
int main() {
return square(3);
}
Run Code Online (Sandbox Code Playgroud)
用编译
-std = gnu ++ 17
我的假设
if constexpr (condition)
Run Code Online (Sandbox Code Playgroud)
是在编译过程中
} else {
x
return num;
}
Run Code Online (Sandbox Code Playgroud)
被丢弃,我没有得到关于未定义的错误
X
我的理解是错误的,这个“如果constexpr”是这样的
#ifdef CONDITION
return num * num;
#else
x
return num;
#endif
Run Code Online (Sandbox Code Playgroud)
如何修改此代码以进行编译?
谢谢您的帮助