gpt4 book ai didi

c++ - 避免基于作为模板参数的函数的返回值的分支

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:58 25 4
gpt4 key购买 nike

假设以下策略类负责算法的一个方面:

struct VoidF {
static void f() {
... // some code that has side effects
}
};

struct BoolF {
static bool f() {
bool res = ...; // some computation
return res;
}
};

BoolF策略是“增强感知”:当 BoolF::f() 返回 true 时,算法可以退出。 VoidF是“增强意识”,因此它返回 void (我不想强制我的图书馆的用户返回 bool,因为这对他来说没有任何意义)。

算法目前是这样写的:

template <typename F>
struct Algorithm {
void run() {
... // some computation here

if (std::is_same<decltype(F::f()), bool>::value) {
if (F::f()) return;
} else
F::f(); // If F is VoidF, there should be no branching and some
// compiler optimizations will be enabled

... // more computation, unless F::f() got rid of it
}
};

当然,如果 Algorithm 这不起作用用 VoidF 实例化.有没有办法以在 Algorithm<VoidF>::run() 中不应该有分支的方式解决这个问题?如评论所示?

最佳答案

这是我自己在没有 SFINAE 的情况下所做的尝试:

template <typename F>
struct Algorithm {
void run() {
... // some computation here

myRun(std::integral_constant<
bool, std::is_same<decltype(F::f()), bool>::value>());
}

private:
void myRun(std::true_type) {
if (F::f()) return;
moreComputation();
}

void myRun(std::false_type) {
F::f();
moreComputation();
}

void moreComputation() { ... }
};

关于c++ - 避免基于作为模板参数的函数的返回值的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34186365/

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