- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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) );
}
关于c++ - If 函数参数内的语句;分支类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588620/
我是一名优秀的程序员,十分优秀!