gpt4 book ai didi

c++ - 当模板更改一小部分时共享模板功能的通用功能

转载 作者:行者123 更新时间:2023-11-28 05:30:25 24 4
gpt4 key购买 nike

我的项目有几个与模板相关的尴尬位置。我知道我的用法有点不标准,但尴尬是基本好处(主要是展开一堆循环)。又名请不要回应“哦,你不应该使用模板”。所涉及的尴尬已根据经验证明具有超过 10 倍的加速...

下面的模板使用 enum class SomeThing : uint8_t。有一个

template <SomeThing ST>
struct projection_functor {
static constexpr unsigned WIDTH = 640u;/// *** only in
static constexpr unsigned HEIGHT = 480u;/// *** specializations...
void toXYZ(...);
...
};

它保证 enum class SomeThing 的每个可能值都有专门的版本。此外,非专用版本实际上不提供 WIDTHHEIGHT,只有专用版本提供(这是我的编译时保证措施)。

我想做的是使用这些闭包定义一个函数:

template <SomeThing ST>
void forEachXYZ(...params...) {
if(ST == SomeThing::FIRST)
using proj = projection_functor<SomeThing::FIRST>;
else if(ST == SomeThing::SECOND)
using proj = projection_functor<SomeThing::SECOND>;
else
throw std::runtime_error("Unsupported...");

for(unsigned i = 0; i < proj::WIDTH * proj::HEIGHT; ++i) {
// ... setup ...
proj pf;
pf.toXYZ(...);
}
}

虽然这不会编译,但我猜想 proj 的问题在每种情况下都没有正式定义。这是一个非常丑陋但实用的解决方案,我想将其保留在 forEachXYZ 中:

#define THIS_UGLY_MACRO() \
for(unsigned int i = 0; n < proj::WIDTH * proj::HEIGHT; ++i) { \
/* ... setup ... */ \
proj pf; \
pf.toXYZ(...); \
}

现在我可以打电话了

template <SomeThing ST>
void forEachXYZ(...params...) {
if(ST == SomeThing::FIRST) {
using proj = projection_functor<SomeThing::FIRST>;
THIS_UGLY_MACRO();
}
else if(ST == SomeThing::SECOND) {
using proj = projection_functor<SomeThing::SECOND>;
THIS_UGLY_MACRO();
}
else
throw std::runtime_error("Unsupported...");
}

这显然有效,因为它的范围是从模板参数比较中评估的 if 语句。

这是唯一的解决方案,还是有更好的方法能够根据模板参数通知循环 proj 实际是什么?

我想编写一个辅助函数是可以完成的,但这是一个更高层次的问题“我实际上可以用这种方式使用模板做什么”。

感谢您的任何建议:)

最佳答案

您可以定义模板而不是宏:

template <class Projection>
void projectXYZ(...params...) {
for(unsigned int i = 0; n < proj::WIDTH * proj::HEIGHT; ++i) {
/* ... setup ... */
Projection pf;
pf.toXYZ(...);
}
}

然后调用它:

template <SomeThing ST>
void forEachXYZ(...params...) {
if(ST == SomeThing::FIRST) {
projectXYZ<projection_functor<SomeThing::FIRST>>(std::move(param), ...);
}
else if(ST == SomeThing::SECOND) {
projectXYZ<projection_functor<SomeThing::SECOND>>(std::move(param), ...);
}
else {
throw std::runtime_error("Unsupported...");
}
}

关于c++ - 当模板更改一小部分时共享模板功能的通用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39683779/

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