首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++11上模拟通用/模板化lambdas

在C++11上模拟通用/模板化lambdas
EN

Stack Overflow用户
提问于 2013-09-12 04:46:54
回答 1查看 522关注 0票数 0

我有一个问题,我在哪里有这样的东西:

代码语言:javascript
复制
#define A_BODY printf("b is %s and c is %d, typeless! :3\n", b, c);
#define B_BODY return "test";
#define C_BODY return 42;

我需要编写一段代码,例如,调用a(b(),c()),以及它们各自的类型。

在C++14上,我可以轻松地做到这一点:

代码语言:javascript
复制
template<typename B, typename C> auto a(B &&b, C &&c) {
  A_BODY
};
auto b() {
  B_BODY
};
auto c() {
  C_BODY
};

int main() {
  auto _b = b();
  auto _c = c();
  auto _a = a(_b, _c);

  return 0;
};

达到预期的结果...有没有办法在C++11上得到同样的结果?:'(

而且,它们可以递归地相互调用,所以这里的简单排序也不会有帮助。

编辑

我会试着更好地解释我的情况。

我得到了一个这样的输入文件,例如:

代码语言:javascript
复制
a is b c {
  printf("b is %s and c is %d\n", b, c);
  if(c > 42)
    printf("c is bigger than the truth!\n");
  return strlen(b) + c;
};
b is {
  return "test";
};
c is {
  return 42;
};

我需要生成一个可以正确调用它们的C++代码。我正在尝试推断返回类型,而不需要在输入文件中定义它们。

从中,我可以获得*_BODY规范、参数数量和调用顺序,但我不知道参数是哪种类型。例如,我需要一个模板化的lambda来对函数体进行惰性计算。

我可以在GCC和CLang上使用C++14做到这一点,但这是一个商业项目,我也需要支持Visual Studio2012。我正在尝试找到解决方法,如果有的话。:(

EN

回答 1

Stack Overflow用户

发布于 2013-09-12 05:17:35

可以这样做:

代码语言:javascript
复制
#define A_EXPR printf("b is %s and c is %d, typeless! :3\n", b, c)
#define B_EXPR "test"
#define C_EXPR 42

template<typename B, typename C> auto a(B &&b, C &&c)
    -> decltype(A_EXPR) { return A_EXPR; }
auto b() -> decltype(B_EXPR) { return B_EXPR; }
auto c() -> decltype(C_EXPR) { return C_EXPR; }

int main() {
  auto _b = b();
  auto _c = c();
  auto _a = a(_b, _c);
  return 0;
};

在clang中工作得很好。另一方面,gcc (4.8.1)抱怨说

代码语言:javascript
复制
sorry, unimplemented: string literal in function template signature

对于函数a,但实际上并不需要结果;它可以只是void

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18750965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档