gpt4 book ai didi

c++ - 编译器无法推断出要返回哪种模板类型

转载 作者:行者123 更新时间:2023-11-30 03:33:45 27 4
gpt4 key购买 nike

相关代码是:

std::fstream fout("Logs.txt");
class Logs;
typedef std::ostream& (*ostream_manipulator2)(std::ostream&);
class LogsOutput
{
public:
LogsOutput() {}
~LogsOutput() {}
Logs * pLogs;
friend LogsOutput& operator<<(LogsOutput &logsClass, std::string &strArg);
friend LogsOutput& operator<<(LogsOutput &logsClass, const char *strArg);
friend LogsOutput& operator<<(LogsOutput &logsClass, ostream_manipulator2 pf);
friend LogsOutput& operator<<(LogsOutput &logsClass, uint64_t number);
};
LogsOutput *pLogsOutput;
template <typename T>
T& LOUToutput()
{
if (pLogsOutput)
{
return (*pLogsOutput);
}
else
return fout;
}

我想这样调用这个函数:

LOUToutput () << "Print this line " << std::endl;

但有时 LogsOutput 类未创建,因此取消引用其指针会崩溃,在这种情况下我宁愿输出到文件。我知道编译器无法在编译时判断 LogsOutput 类是否会被实例化,因此无法推断出模板的类型,但我看不到任何其他方法可以让它工作.所以我的问题是我的函数如何根据运行时条件返回不同的类型?

最佳答案

对此的复杂解决方案是使用继承。如果你要从 std::ostream 继承,你可以返回一个公共(public)基类(如果你有兴趣,这里有一个讨论:How to inherit from std::ostream?)

在我看来,更简单的解决方案是返回一个根据需要重定向输出的代理类。

struct LogProxy {
LogsOutput *pLog;
// ...
LogProxy &operator<<(std::string &o) {
if(pLogsOutput) {
*pLog << o;
} else {
// Assuming this is available as a global.. You probably don't want to do that
fout << o;
}
return *this;
}
// ....
};

LogProxy LOUToutput() {
return LogProxy { pLogsOutput; };
}

其他一些一般性评论:

  1. 如果您想使用模板,您需要将其设为编译时条件。您可以使用 std::enable_if<> 之类的东西来提供 LOUToutput() 的多个模板重载,这些模板在编译时选择登录的位置。

  2. 我猜这只是为了发布到 SO,但您的代码在头文件中声明了多个全局变量。你需要解决这个问题。

  3. 您的代码中没有 const 声明。许多这些运算符看起来至少应该在其输出(字符串等)参数上声明为 const。

编辑:这是这个想法的一个工作(正确编译)示例:

#include <iostream>

struct PRXY {
bool cond;

const PRXY &operator<<(const std::string &t) const {
if(cond) {
std::cout << t;
} else {
std::cerr << t;
}
return *this;
}
};

PRXY pr(bool cond) {
return PRXY { cond };
}

void test() {
pr(false) << "Hello";
}

关于c++ - 编译器无法推断出要返回哪种模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42613637/

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