是编译器还是我自己:继承自 lambdas 组成的可变参数模板

Posted

技术标签:

【中文标题】是编译器还是我自己:继承自 lambdas 组成的可变参数模板【英文标题】:Is it the compiler or just me: Inheriting from variadic template consisting of lambdas 【发布时间】:2015-03-12 02:34:25 【问题描述】:

我有一些代码可以在 GCC 下工作,但无法在 Visual Studio 2015 下编译(我意识到这是在开发中,但我认为应该实现这个区域)。

template< typename... T >
class inherit : public T...

public:
inherit(T... t) : T(t)... 
;

int main() 
  auto l1 = []() ;
  auto l2 = []() ;
  inherit<decltype(l1), decltype(l2)> test(l1, l2);
  return 0;

这就是代码 sn-p 简化为它的纯粹本质。 Visual Studio 在继承的构造函数上说“语法错误:'type'”。然后它会吐出一点关于它是如何到达那里的痕迹,并以“你不能构造 lambda 的实例”作为结尾。

我的假设是 T(t)... 的扩展没有正确扩展。但是我很可能会弄错语法。

编辑:对不起,问题是:我在这里有错吗?如果是这样,正确的语法是什么?

附加发现:根据我收到的回复,这似乎是 Visual Studio 2015 在这方面存在错误的问题。在测试中,似乎将构造函数参数传递给存在问题的 lambda 基类的扩展。以下测试在 VS2015 下工作:

template< typename T1, typename T2, typename... T3 >
class inherit2 : public T3...

public:
  inherit2(T1 t1, T2 t2) : T1(t1), T2(t2) 
;

int main() 
  auto l1 = []() ;
  auto l2 = []() ;
  inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2);
  return 0;

【问题讨论】:

看起来不错,clang++ 也接受它。当您删除可变性但保留 lambda 时会发生什么? 我认为 Visual Studio 在某些情况下传递 lambda 时会出现问题 connect.microsoft.com/VisualStudio/feedback/details/727957/… ***.com/questions/25777396/… 您的代码从 gcc 4.6 和 clang 3.1 开始就被支持(都是从 2012 年初开始的)。 Visual C++ 在这方面落后了 3 年。 @dyp 失败需要可变参数。经过更多的混乱之后,似乎是 T(t)... 扩展,用于将参数传递给导致问题的基本构造函数。我将根据发现编辑我的帖子,以防其他人在遇到相同问题时偶然发现此问题。 顺便说一句,由于 C++ 中没有 using Ts::operator()...; 语法,如果你想创建一个“lambda 的覆盖”类型,你必须通过树或线性继承.顺便说一句,您在“VS2015 中的作品”示例中缺少: public T1, public T2 【参考方案1】:

这是编译器。 more recent MSVC, v. 19.00.23106.0 从 2015 年 7 月开始,按原样接受您的示例。

也许大括号初始化语法Tt... 会有所帮助。不过,我找不到合适的在线编译器来尝试。

【讨论】:

以上是关于是编译器还是我自己:继承自 lambdas 组成的可变参数模板的主要内容,如果未能解决你的问题,请参考以下文章

自定义异常

不知道从哪里开始继承 UIControl!

死磕Lambda表达式:更简洁的Lambda

thinkphp5.0自定义验证器

visual studio 2010自定义类继承CString问题

自定义异常