小编lub*_*bgr的帖子

从C ++ 17之前的初始值设定项推导的std :: vector类型... C ++ 11的任何解决方法?

我从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。

任何建议都非常欢迎

c++11

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

Lua 是否有像 Swift 或 C# 中那样的变量?.function() 之类的东西?

大家好!

我最近在用 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 有一些方法来实现这种功能吗?

lua

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

为什么或何时应该在调用之前将可调用函数参数转换为rvalue?

到目前为止,我已经考虑过传递和调用一个可调用的

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()是否被重载&&&获得了上述代码段替代库的提示,但事实并非如此.

在此先感谢您的提示和答案!

c++ higher-order-functions move-semantics

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

C ++习惯用法:如何将右值作为右值传递?

以下代码无法编译。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++ reference rvalue c++11

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

C++20 模板 lambda:如何指定模板参数?

假设我有一个 C++20 模板 lambda:

auto foo = []<bool arg>() {
    if constexpr(arg)
        ...
    else
        ...
};
Run Code Online (Sandbox Code Playgroud)

但是我怎么称呼它呢?我似乎找不到语法的描述。我尝试了通常的foo<true>();and template foo<true>();,但 gcc 似乎都不喜欢。

c++ lambda templates c++20

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

声明与 类的定义

我有一个关于类声明与类定义的快速问题。

因此,我可以想到四种不同的类代码方案:

哪些符合声明,哪些符合定义?为什么?

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)

c++

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

对'if constexpr'的理解有误

我有以下代码

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)

如何修改此代码以进行编译?

谢谢您的帮助

c++ c++17 if-constexpr

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