【问题标题】:Templated Lambda function with compile time constants具有编译时间常数的模板化 Lambda 函数
【发布时间】:2019-03-17 04:35:03
【问题描述】:

我在网上获得了这段代码 (split code),以一种非常酷的方式拆分字符串,但我想让它更通用和易于管理。我已经实现了一种解决方法,通过输入参数将其作为带有 constexpr 的模板类传递,但我想知道是否有人知道我如何使这项工作。

我创建了一个接受一个编译时间常数的 lambda 函数,我正在尝试调用它。在调用站点,它会将模板参数误认为是一个试图执行小于运算符的表达式。

auto splt_val = []<char delimiter='\n'>(std::string s)->std::vector<std::string>{
              std::istringstream iss(s);
              std::vector<std::string> parm_data(
                 (std::istream_iterator<WordDelimitedBy< delimiter > >(iss)),
                  std::istream_iterator<WordDelimitedBy< delimiter > >());
              return parm_data;
};

splt_val<'\n'>("test"); //<-- DOESN'T WORK

splt_val("test");       //<-- THIS WORKS

【问题讨论】:

  • 以前没见过。这是 GCC 扩展吗?是 ISO C++ 还是提议的?
  • 应该在规范中; -std=C++14 是我使用的编译旋钮。
  • 看起来它可能是在 C++20 中出现的,而不是在当前的 VS 2017 中,它最终是相当兼容的。 en.cppreference.com/w/cpp/language/lambda

标签: c++ templates lambda c++20


【解决方案1】:
splt_val.operator()<'\n'>("test");

是的,这种语法很糟糕。

template<char delimiter='\n'>
constexpr auto splt_val = [](std::string n)-> // ...

这为您提供了您所要求的语法。但这意味着每个模板参数都有一个不同的splt_val 对象。

你可能会写:

splt_val['\n'_k]("test")

我们在哪里写一个适配器,但这会很尴尬。

【讨论】:

  • 工作就像一个魅力!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2014-06-30
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2011-07-21
相关资源
最近更新 更多