【发布时间】:2017-01-16 15:38:29
【问题描述】:
我想在一个地方创建几个模板化 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 的一部分一样,我希望尽可能地为该“库”的用户提供易用性。 Lambda 旨在提供这一点。 @AndyG 的建议很有用——对于 lambda,ProcessingForAllFormats 的实现必须不同。但我不知道 C++14/17 中的 lambda 模板是否强大到足以构建这样的 API。
【问题讨论】:
-
旁注:你应该从 template
类型名切换到 template 类,否则你会在某些编译器中触发迂腐警告...
标签: c++ templates c++14 instantiation static-polymorphism