gpt4 book ai didi

c++ - 将方法的替代实现 (SFINAE) 移动到单独的文件

转载 作者:行者123 更新时间:2023-11-28 00:13:34 25 4
gpt4 key购买 nike

我有一个带有 bool 作为模板参数的类来控制类的行为(在我的特定情况下,它控制是否将缓存用于某些计算)。所有不受此选项影响的方法都在 .h 文件中定义并在 .tpp 文件中实现。虽然,一种方法的实现取决于传递的模板参数,但我无法弄清楚如何将其实现也移动到单独的文件中。目前我有类似这个例子的东西。

我的类.h

template<bool enableCache = false>
class MyClass
{
public:
MyClass() {}
void someMethod();

template<bool fwd = enableCache, typename std::enable_if<fwd>::type* = nullptr>
unsigned int calcSomething() {
// ask cache if calculation is necessary
return 0;
}

template<bool fwd = enableCache, typename std::enable_if<!fwd>::type* = nullptr>
unsigned int calcSomething() {
// always recalculate
return 1;
}
};

#include "MyClass.tpp"

MyClass.tpp

template<enableCache>
void MyClass<enableCache>::someMethod() {
// do something
return;
}

此设置有效(除非我在简化原始代码时引入了一些小错误),但我也想将 calcSomething 的实现移至 .tpp。有人可以帮我吗?

最佳答案

你可以直接转发到一个非模板函数:

unsigned int calcSomething() {
return calcSomethingImpl(std::integral_constant<bool, enableCache>{});
}

unsigned int calcSomethingImpl(std::true_type /* enableCache */) {
// ask cache if calculation is necessary
return 0;
}

unsigned int calcSomethingImpl(std::false_type /* enableCache */) {
// always recalculate
return 1;
}

这样您就根本不必处理 SFINAE,并且非模板成员函数比成员函数模板更容易推理。

此外,您可以拥有 MyClass<bool >继承自一个非模板类,它提供了两个 calcSomethingImpl s 是 protected 函数 - 这将允许您在源文件而不是 header 中定义它们(如果您愿意的话)。

关于c++ - 将方法的替代实现 (SFINAE) 移动到单独的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31814777/

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