gpt4 book ai didi

c++ - If 函数参数内的语句;分支类型

转载 作者:行者123 更新时间:2023-11-30 01:51:51 28 4
gpt4 key购买 nike

我使用 Clojure(一种函数式语言)编程已有一段时间了,而且我不得不使用 C++ 来上课。我一直在尝试使用我在 Clojure 中喜欢的一些功能(例如,高阶函数、lambda、参数线程、动态类型等),但我遇到了一些困难。

您可以在 Clojure(我假设其他函数式语言)中做的一件事是在任何地方使用几乎任何函数。例如,Clojure 中的 if 语句可以插入到函数调用的参数/参数中,但在 C++ 中,这是不可能的。

作为我正在做的更大的事情的简化示例,我正在尝试使以下内容起作用:

println(if (true) { 100 } else { 200 });

我实现了函数 println 来接受任意数量的参数;它的工作方式就像 Clojure 的 println(类似于 Java 的 System.out.println),但使用 cout

显然,if 语句的语法可能是每个分支之后必须有一个分号(除非没有括号的较短语法替代方案)。所以我添加了分号并将其放入函数 println 中,但这没有用 - 编译器抛出了一个 expected expression 错误。

所以我转向了宏。起初,我实现了这个:

#define if1(pred, expr_true, expr_false) \
if (pred) { \
return expr_true; \
} else { \
return expr_false; \
}

然后我把它放在 println 中,像这样:

println(if1(true, 100, 200));

但这导致编译器抛出同样的错误。

所以我想也许我可以将 if 语句包装在 lambda 中(因为在 C++ 中,不能在函数调用的参数中声明函数):

#define if2(pred, expr_true, expr_false) \
[]() -> decltype(auto){ \
if (pred) { return expr_true; } \
else { return expr_false; }}()

我是这样用的:

println(if2(true, 100, 200));

这一次,显然编译器不再关心 if 语句处于奇怪的位置,它编译正常并打印出预期值 100

但是,当我尝试 println(if2(true, "true!", 200)) 时,编译器生成了以下错误:

error: 'decltype(auto)' in return type deduced as 'int' here but deduced as 'char const (&)[5]' in earlier return statement

如何解决此错误?

另外,一般来说,假设 decltype(auto) 在这些情况下似乎不起作用,我如何声明返回类型根据分支条件语句的不同可能返回类型而变化?

感谢您的帮助!

注意:我使用带有参数的 g++ -Wall -Wextra -pedantic -std=c++1y .

最佳答案

你可以使用 boost::variant

#include <boost/variant.hpp>

template<typename T, typename U>
auto if2(bool cond, T const& t, U const& u)
{
typedef boost::variant<T const&, U const&> vari;
return cond ? vari(t) : vari(u);
}

int main()
{
println( if2(rand() % 2 == 0, "true", 200) );
}

Demo

关于c++ - If 函数参数内的语句;分支类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com