C++17中没有自动参数的模板lambdas
Templated lambdas in C++17 without an auto argument
我有一个从类Base<ResourceType>
:继承的类Derived
template <class ResourceType>
class Base {
protected:
ResourceType* resource;
public:
void set_resource(ResourceType* resource) {
this->resource = resource;
}
};
template <class ResourceType>
class Derived : public Base<ResourceType> {
public:
using Base<ResourceType>::resource;
void print () {
std::cout << *resource << std::endl;
}
};
我想创建一个工厂来创建类型为Derived
的对象。我当然可以通过以下功能做到这一点:
template <typename ResourceType>
auto derived_factory () {
return new Derived<ResourceType>();
}
auto derived = *(derived_factory<int>());
但是,我无法为工厂编写lambda函数。如果我使用auto关键字接受模板参数,我可以编写模板化的lambda函数,但这里我只想使用模板来确定返回类型。以下故障:
auto derived_factory = []<typename ResourceType>() {
return new Derived<ResourceType>();
};
auto derived = *(derived_factory<int>());
错误:
inherit_unknown_type.cpp: In function ‘int main()’:
inherit_unknown_type.cpp:27:36: error: expected primary-expression before ‘int’
auto derived = *(derived_factory<int>());
^~~
inherit_unknown_type.cpp:27:36: error: expected ‘)’ before ‘int’
我只是打错lambda了吗?还是我必须等待C++20
?
(事实上,我的GCC在诊断中说:error: lambda templates are only available with -std=c++2a or -std=gnu++2a [-Wpedantic]
(
但您不必等待C++20,它已经被带有-std=c++2a
标志的GCC 8支持了。
您必须更改调用语法:您需要的不是derived_factory<int>()
,而是derived_factory.operator()<int>()
。
作为一种替代方案(如果你不想要一个免费的函数(,我建议使用标签调度的变体:
auto derived_factory = [](auto tag) {
return new Derived<typename tag::type>();
};
template <typename T> struct tag_type {using type = T;};
// Usage:
derived_factory(tag_type<int>{})
此外,即使你以某种方式编译它,这一行:
auto derived = *(derived_factory<int>());
无论如何都会导致内存泄漏。为了避免这种情况,您应该将结果存储为指针或引用。或者更好的是,使用智能指针。
等待C++20,您可以从模板类返回lambda
template <typename ResourceType>
auto make_derived_factory ()
{ return []{ return new Derived<ResourceType>{}; }; }
auto derived = make_derived_factory<int>();
int main ()
{
auto df { derived() };
}
以上不起作用,但这起作用:
auto derived_factory = [](auto tag)
{
return new Derived<decltype(tag)::type>();
};
template <typename T> struct tag_type {using type = T;};
// Usage:
derived_factory(tag_type<int>{})
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- C++17中没有自动参数的模板lambdas
- C 17继承了带有模板参数扣除指南的Lambdas集
- 如何使C++11函数生效<>参数自动接受lambdas
- 使用auto参数从lambdas返回值
- C++Lambdas:捕获列表与参数列表
- 如何使用QT5中的lambdas将具有int参数的信号连接到具有枚举参数with的插槽
- lambdas的模板参数推导
- 引用参数到 lambdas
- 模板参数值中的Lambdas
- 通过Lambdas解包可变参数
- 函数作为模板参数的多态签名(使用lambdas)