我一直在审查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不需要它们?
注意:请记住上面的示例不是唯一的例子,它仅作为代码类型的指南提供.仅专注于为上述代码提供解决方法的答案将不被视为有效!
相关来源:
我正在尝试使用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)
没有警告,没有错误.它是有效的代码还是被编译器拒绝?
考虑这个代码:
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 说了类似的话。
有理由不允许吗?我不明白为什么它不能工作,即使封闭类是一个模板。
以下代码片段不会在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++多态性似乎是连贯的.像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++代码标准是否兼容?
#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).
可能重复:
lambda函数可以模板化吗?
是否可以使用模板参数的c ++ 0x lambda?例如:
template <typename T> [=](const T *x) {}
Run Code Online (Sandbox Code Playgroud)
我想要做的是在类型列表(可变参数列表)上编写静态for循环,并且我想将当前类型作为参数传递给目标仿函数(或lambda)的operator().
好的,所以我有一些基本上像这样的设置:
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中这样做,看起来它可能是编译器错误.任何可能的解决方法?
我能够使用 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)
所以我想要做的是扩展程序中现有的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++ ×9
lambda ×6
c++11 ×4
templates ×3
gcc ×2
c++-concepts ×1
c++20 ×1
clang ×1
duck-typing ×1
generics ×1
iterator ×1
polymorphism ×1
standards ×1
vector ×1