相關的代碼是:編譯器無法推斷出模板類型返回
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
類是否會被實例化,因此不能推斷出模板的類型,但我沒有看到任何其他方式可以使它工作。 所以我的問題是我的函數如何根據運行時條件返回不同的類型?
如果您需要在運行時類型來區分,你有沒有考慮建立一個返回超類的功能,並根據您關心的任何運行時情況在運行時返回該類的兩個子類之一?模板實例化在編譯時發生,根據類的特定類型在運行時解決要調用的虛擬方法的實現。 – AustinZ