gpt4 book ai didi

C++ - 为任何 lambda 创建一桶实例化

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:16 26 4
gpt4 key购买 nike

我想在一个地方创建 templated-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 所注意到的 - 使用仿函数确实更容易实现,但更难使用。我对待 FormatSomeDataProcessingForAllFormats 就像它是库/API 的一部分一样,我希望尽可能多地为该“库”的用户提供尽可能易于使用。 Lambda 旨在提供这一点。 @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>{};
}

关于C++ - 为任何 lambda 创建一桶实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41679904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com