C++-为任何lambda创建一个实例化桶
C++ - create a bucket of instantiations for any lambda
我想在一个地方创建几个模板化lambda的实例。每个实例的数量和参数在编译时都是已知的,所以我认为这是可能的。这是我想做的事情的一般说明:
enum class Format
{
FORMAT_1,
FORMAT_2
//, ...
};
template<Format F>
struct SomeData
{
//...
};
template < template<Format> typename Processing >
struct ProcessingForAllFormats
{
Processing<Format::FORMAT_1> processingObject1;
Processing<Format::FORMAT_2> processingObject2;
//...
};
template < template<Format> typename Processing >
decltype(auto) makeProcessingForAllFormats(Processing lambda)
{
//I know this function is completely wrong as
//concrete instantation needs concrete type as an argument
//instead of a template
return ProcessingForAllFormats<Processing>();
}
int main() {
auto processing = makeProcessingForAllFormats(
[](SomeData<auto> data) {/*...*/}
);
return 0;
}
这是我问题的简化图。总之,我想存储任何SomeData对象的处理实例,以备将来使用。我不知道在C++14甚至C++17中是否可能。我知道如果我使用动态多态性而不是静态多态性,这会很容易,但在这种情况下,性能对我来说意义重大。
编辑:
正如TartanLlama所注意到的,使用函子确实更容易实现,但更难使用。我对待Format
、SomeData
和ProcessingForAllFormats
就像它是库/API的一部分一样,我希望尽可能多地为该"liblary"的用户提供易用性。Lambdas旨在提供这一点@AndyG的建议很有用——对于lambdas ProcessingForAllFormats,实现必须不同。但我不知道C++14/17中的lambda-模板是否足够强大,可以构建这样的API。
用lambda做这件事听起来很痛苦,因为它不是从模板生成的闭包,而是operator()
。有了函子模板,这就容易多了:
enum class Format
{
FORMAT_1,
FORMAT_2
//, ...
};
template<Format F>
struct SomeData
{
//...
};
template < template<Format> typename Processing >
struct ProcessingForAllFormats
{
Processing<Format::FORMAT_1> processingObject1;
Processing<Format::FORMAT_2> processingObject2;
//...
};
template <Format F>
struct Processor {
void operator() (SomeData<F> data) { /*...*/ }
};
int main() {
auto processing = ProcessingForAllFormats<Processor>{};
}
用限制为所需类型的接口包装泛型lambda如何:
enum class Format
{
FORMAT_1,
FORMAT_2
//, ...
};
template<Format F>
struct SomeData
{
//...
};
template <typename GenericProcessing, Format format>
struct Restrictor
{
Restrictor(GenericProcessing genericProcessingObject)
: genericProcessingObject(genericProcessingObject)
{}
decltype(auto) operator()(SomeData<format> data)
{
return genericProcessingObject(data);
}
private:
GenericProcessing genericProcessingObject;
};
template <typename GenericProcessing>
struct ProcessingForAllFormats
{
Restrictor<GenericProcessing, Format::FORMAT_1> processingObject1;
Restrictor<GenericProcessing, Format::FORMAT_2> processingObject2;
//...
ProcessingForAllFormats(GenericProcessing genericProcessingObject)
: processingObject1(genericProcessingObject)
, processingObject2(genericProcessingObject)
//...
{}
};
template <typename GenericProcessing>
decltype(auto) makeProcessingForAllFormats(GenericProcessing genericProcessingObject)
{
return ProcessingForAllFormats<GenericProcessing>(genericProcessingObject);
}
int main() {
auto processing = makeProcessingForAllFormats(
[](auto data) {/*...*/});
processing.processingObject1(SomeData<Format::FORMAT_1>{}); // ok
//processing.processingObject1(SomeData<Format::FORMAT_2>{}); // fail by design, expects SomeData<Format::FORMAT_1>
//processing.processingObject2(SomeData<Format::FORMAT_1>{}); // fail by design, expects SomeData<Format::FORMAT_2>
processing.processingObject2(SomeData<Format::FORMAT_2>{}); // ok
}
相关文章:
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 如何正确实例化静态字段 tat 是另一个类对象
- C++ - 使用另一个类的构造函数实例化一个对象
- 如何使用另一个模板化类的实例模板化类?
- 如何使用其中一个具体类实例化抽象类?
- 另一个类中嵌套模板的外部实例化
- 即使我正在.cpp文件中实例化一个伪对象,.cpp文件内模板函数的定义也不起作用
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 在 C++17 中的每个实例化时生成一个新类型
- 如何使用 c++ 从另一个 cpp 文件中的 main.cpp 调用实例化类
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 在模板中,有没有办法为每个时间实例化只编写一个专用化?(纳秒、毫秒、秒等)
- 在另一个对象 B 中创建对象 A 时,对象 A 是否是对象 B 的本地对象,对象 A 是否会存在于对象 B 的实例化之外?
- 实例化一个模板类,该类采用具有不同函数签名的构造函数中的函数指针
- 在类实例化时生成一个数字
- C++-为任何lambda创建一个实例化桶