gpt4 book ai didi

c++ - 重载可变参数模板化方法

转载 作者:行者123 更新时间:2023-12-03 07:00:30 24 4
gpt4 key购买 nike

我的编译器很难理解这段代码,我费了好几个小时才找到问题所在。

#include <utility>
#include <string>

template<typename Derived>
struct AssetLoader {
template<typename... Args>
void doLoad(Args&& ... args) const {
static_cast<const Derived *>(this)->load(std::forward<Args>(args)...);
}
};

struct TextureLoader : public AssetLoader<TextureLoader> {
void load(const std::string &path) const {
// some code
}
};

struct SomeOtherLoader : public AssetLoader<SomeOtherLoader> {
void load(const std::string &path) const {
// some code
}
};

template<typename DefaultLoader>
class Resources {
AssetLoader<DefaultLoader> m_defaultLoader;

public:
Resources(AssetLoader<DefaultLoader> defaultLoader):
m_defaultLoader(std::move(defaultLoader)) {}

template<typename... Args>
void load(Args&& ... args) {
load(m_defaultLoader, std::forward<Args>(args)...);
}

template<typename Loader, typename... Args>
void load(const AssetLoader<Loader>& loader, Args&& ... args) {
loader.doLoad(std::forward<Args>(args)...);
}
};

int main() {
Resources<TextureLoader> resources(TextureLoader{});
resources.load("image.png");
resources.load(SomeOtherLoader{}, "example.jpg");
return 0;
}
我收到此错误:
fatal error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum)
return load(m_defaultLoader, std::forward<Args>(args)...);
~~~~~~~~~~~~~~~~~~^~~~~~
我的实际代码要复杂得多,但我将其精简为这个,但我遇到了同样的错误。
如果我评论第一个重载,它运行良好,但我无法在不传递 Loader 的情况下调用 load() 方法。我想要默认加载器的重载,所以我可以做 resources.load("image.png");我使用 mingw64 8.1
任何的想法?

最佳答案

编译器会准确地告诉您问题出在哪里——这里是无限递归:

template<typename... Args>
void load(Args&& ... args) {
load(m_defaultLoader, std::forward<Args>(args)...);
}
这个函数无限地调用自己。永远不会选择另一个重载,因为 Args&&合成比 AssetLoader<Loader> const& 更好的匹配(具体来说, TextureLoader const& )。
给另一个重载一个不同的名字来消除歧义......
template<typename... Args>
void load(Args&& ... args) {
load2(m_defaultLoader, std::forward<Args>(args)...);
}

template<typename Loader, typename... Args>
void load2(const AssetLoader<Loader>& loader, Args&& ... args) {
loader.doLoad(std::forward<Args>(args)...);
}

关于c++ - 重载可变参数模板化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64417530/

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