gpt4 book ai didi

具有相同名称但返回类型不同的 C++ 模板函数

转载 作者:太空狗 更新时间:2023-10-29 20:37:06 25 4
gpt4 key购买 nike

我正在尝试制作一些可以读取或写入不同类型的文件流。除了使用特定方法的阅读部分外,一切正常。该方法返回 std::unique_ptr<T>当被调用时,它是另一个返回 T 的方法的“包装器” .由于某种原因,编译器不使用此方法,而是尝试使用另一种方法(返回 T 的方法)对其进行编译。编译因此失败。我已经尝试在互联网上搜索,但找不到任何准确的答案。你能帮我解决这个问题吗?

我定义的两个方法:

template <typename T>
T read()
{
T obj;
obj.readFromFile<T>();
return std::move(obj);
}

template <
typename T,
template<typename> class D,
template<typename, typename> class Container
>
typename std::enable_if_t<
std::is_same<Container<T, D<T>>, std::unique_ptr<T, D<T>>>::value,
Container<T, D<T>>
>
read()
{
return std::move(std::make_unique<T, D<T>>(readFromFile<T>()));
}

后一种方法是我要调用的方法。

当我写这样的东西时:

std::unique_ptr<A> AfromFile = fileStreamer.read<std::unique_ptr<A>>()

编译器尝试使用第一种方法 ( template <typename T> T read() {...} ) 编译它,但编译失败。如果我做了 unique_ptr object,我就能完成这项工作首先,然后将复制分配给 *unique_ptr<A> object但这对我没有好处,因为我在这两个函数上使用了一些宏,我无法制作 unique_ptr<A> object或在调用宏之前对象 A 本身。仅供引用,我使用的是 Visual Studio 2015。

有什么方法可以在不做任何重大修改的情况下完成这项工作吗?我还发现了一个建议,基本上说你必须向一个函数添加一个指针参数,然后用 static_cast<Obj>(nullptr) 调用它。作为论据,但这在我的示例中不算数。

感谢您的帮助。

更新:我只想说,下面的所有解决方案都对我有用,但解决我的问题的最简单方法是 Barry 提供的解决方案。再次感谢您帮助我!

最佳答案

看起来你想要偏特化,并且由于函数的偏特化是不可能的,你可以转到类:

template <typename T> struct helper
{
T operator() const
{
T obj;
obj.readFromFile<T>();
return obj;
}
};

template <typename T, typename D>
struct helper<std::unique_ptr<T, D>>
{
std::unique_ptr<T, D> operator() const
{
return std::make_unique<T, D>(readFromFile<T>());
}
};

template <typename T>
T read()
{
return helper<T>{}();
}

关于具有相同名称但返回类型不同的 C++ 模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36033353/

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