相关疑难解决方法(0)

C++ 11和缺乏多态lambda - 为什么?

我一直在审查C++ 11标准的草案版本.特别是关于lambdas的部分,我对于不引入多态lambda的原因感到困惑.

例如,在100001种方式中可以使用多态lambda,我曾希望我们可以使用如下代码:

template<typename Container>
void foo(Container c)
{
    for_each(c.begin(), c.end(), [](T& t) { ++t; });
}
Run Code Online (Sandbox Code Playgroud)

原因是什么:

  • 是不是委员会没时间了?

  • 多态lambda太难实现了吗?

  • 或者也许他们认为PTB不需要它们?

注意:请记住上面的示例不是唯一的例子,它仅作为代码类型的指南提供.仅专注于为上述代码提供解决方法的答案将不被视为有效!

相关来源:

c++ polymorphism lambda standards c++11

36
推荐指数
3
解决办法
6229
查看次数

[] <typename>(){}是一个有效的lambda定义吗?

我正在尝试使用lambdas和编译器,因为这里有另一个问题.
我刚刚意识到(并且确实非常正常)以下代码是有效的:

int main() {
    auto l = [](){};
    l.operator()();
}
Run Code Online (Sandbox Code Playgroud)

实际上标准说闭包类型有一个公共内联函数调用操作符等等,因此能够调用它是有意义的.

通过查看标准(以及工作草案)我无法解释的是,GCC(6.1)编译了以下代码段(clang 3.9没有):

int main() {
    auto l = []<typename>(){};
    l.operator()<void>();
}
Run Code Online (Sandbox Code Playgroud)

没有警告,没有错误.它是有效的代码还是被编译器拒绝?

c++ lambda gcc clang language-lawyer

23
推荐指数
1
解决办法
1181
查看次数

为什么我不能在类范围内声明一个概念?

考虑这个代码:

struct A
{
    template <typename T>
    concept foo = true;
};
Run Code Online (Sandbox Code Playgroud)

它不编译。我的 Clang 10 给了我error: concept declarations may only appear in global or namespace scope,GCC 说了类似的话。

有理由不允许吗?我不明白为什么它不能工作,即使封闭类是一个模板。

c++ c++-concepts c++20

23
推荐指数
1
解决办法
1061
查看次数

C++ 0x Variadic参数包:语法

以下代码片段不会在gcc4.6.1下编译:

template <typename... TS>
void do_stuff(TS... ts)
{
  auto f = [](TS... things) { };
}
Run Code Online (Sandbox Code Playgroud)

它会抛出一个错误,指出包装没有扩展.但是,以下代码可以编译:

template <typename... TS>
void do_stuff(TS... ts)
{
  auto f = [](TS... things...) { };
}
Run Code Online (Sandbox Code Playgroud)

注意参数列表中的内容之后的额外解包操作符.我从未见过在声明过程中必须扩展可变背包的情况.所以我向你们提出的问题是:

这是合法的C++ 0x语法(编译的代码片段)还是在处理可变参数类型时它只是与GCC的怪癖?

c++ gcc c++11

10
推荐指数
1
解决办法
421
查看次数

为什么C++ 1*仍然需要在Full Duck打字的Lieu中使用模板关键字

许多年前,(至少对我而言)静态C++多态性似乎是连贯的.像Python这样的语言依赖于duck typing,你有:

def fn(foo, bar):
    foo.baz(bar.bo())
Run Code Online (Sandbox Code Playgroud)

而且这个想法是,如果它恰当地"嘎嘎叫",语言就可以了.

相反,在C++中,你必须解释它是什么"动物":

void fn(foo_type foo, bar_type bar);
Run Code Online (Sandbox Code Playgroud)

对于"家族王国",你明确需要使用template关键字:

template<class Foo, class Bar>
void fn(Foo foo, Bar bar);
Run Code Online (Sandbox Code Playgroud)

使用auto ...() -> decltype返回类型等新功能,尤其是通用lambdas,似乎有一些更像非模板类似Python的鸭子类型:

[] (auto container) { return container.size(); };
Run Code Online (Sandbox Code Playgroud)

那么,我的问题是为什么template关键字仍然需要?为什么不完全拥抱(可选)鸭子打字:

// Takes a foo_type and a bar_type 
void fn(foo_type foo, bar_type bar);

// Takes some "foo-quacking" type, and a bar_type
void fn(auto foo, bar_type bar);

// Etc.
Run Code Online (Sandbox Code Playgroud)

c++ generics templates duck-typing

9
推荐指数
1
解决办法
371
查看次数

明确指定泛型lambda的operator()模板参数是否合法?

以下C++代码标准是否兼容?

#include <iostream>

int main()
{
    [](auto v){ std::cout << v << std::endl; }.operator()<int>(42);
}
Run Code Online (Sandbox Code Playgroud)

铛++ 3.8.0克++ 7.2.0 编译该代码细(编译器标志-std=c++14 -Wall -Wextra -Werror -pedantic-errors).

c++ lambda templates language-lawyer generic-lambda

9
推荐指数
2
解决办法
263
查看次数

带有模板参数的C++ 0x lambdas?

可能重复:
lambda函数可以模板化吗?

是否可以使用模板参数的c ++ 0x lambda?例如:

template <typename T> [=](const T *x) {}
Run Code Online (Sandbox Code Playgroud)

我想要做的是在类型列表(可变参数列表)上编写静态for循环,并且我想将当前类型作为参数传递给目标仿函数(或lambda)的operator().

lambda templates metaprogramming c++11

6
推荐指数
1
解决办法
2309
查看次数

Lambda函数无法调用函数模板参数的静态函数

好的,所以我有一些基本上像这样的设置:

template<typename T> void example()
{
 std::function<int (byte*)> test = [=](byte* start) -> int
 {
  return T::magic(start);
 }
}
Run Code Online (Sandbox Code Playgroud)

忽略这些裸体调用的"不洁"程度,它也不会编译,给出这些错误:

'T' : is not a class or namespace name
'magic': identifier not found
Run Code Online (Sandbox Code Playgroud)

有没有办法能够在泛型类型名称T上进行调用,假设我将始终使用具有函数magic(byte*start)的类调用example()?当然,我不必为将要执行此操作的每个类重新声明此模板函数.

我在VC++ 2010中这样做,看起来它可能是编译器错误.任何可能的解决方法?

c++ lambda type-parameter c++11

6
推荐指数
1
解决办法
1658
查看次数

如何调用 lambda 模板?

我能够使用 gcc 编译以下代码:

template<typename... Pack>
auto func(Pack... x) {
    return (x + ...) ;
}

template<typename... Pack>
auto lamd = [](Pack... x) {
    return (x + ...) ;
};
Run Code Online (Sandbox Code Playgroud)

我可以使用 调用函数模板,但使用或func(1,2,3)调用 lambda 时出现错误。lamd(1,2,3)lamd<int>(1,2,3)

c++ lambda variadic-templates

6
推荐指数
2
解决办法
1320
查看次数

如何将初始化列表构造函数添加到STL向量

所以我想要做的是扩展程序中现有的vector类,让我这样说,

vector<string>* vec = new vector<string>(){"Value1","Value2"};
Run Code Online (Sandbox Code Playgroud)

要么

vector<string>* vec = new vector<string>({"Value1","Value2"});
Run Code Online (Sandbox Code Playgroud)

要么

vector<string> vec = {"Value1","Value2"};
Run Code Online (Sandbox Code Playgroud)

我知道我可以做到这样的事情,但这样做,

string temp[] = {"Value1","Value2"};
vector<string> vec(temp, temp+ sizeof(temp) /  sizeof( temp[0] ) ); 
Run Code Online (Sandbox Code Playgroud)

这使用向量迭代器构造函数但不能删除额外的行吗?

我知道在C#中你可以使用这样的partial关键词添加你想要的任何东西,

public partial class ClassName
{
   ClassName(Stuff stuff)
   {

   }
   void AmazingNewMethod()
   {

   }    
}
Run Code Online (Sandbox Code Playgroud)

C++在某个地方有一个漂亮的技巧吗?

我是否必须继承vector并构建一个customVector具有构造函数的构造函数,它在后面执行迭代器构造函数的事情?

也许将这些行包装在一个静态Helper函数调用中,该调用通过Reference设置它并将其添加到某个工具箱类中?

我觉得很多程序员都遇到过这个问题.那里有优雅的解决方案吗?

谢谢.

编辑:修复标题,提到这是一个初始化列表构造函数.

c++ iterator vector partial-classes

3
推荐指数
2
解决办法
4649
查看次数