관련 코드는 다음과 같습니다컴파일러가 반환하는 템플릿 유형 추론 할 수
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;
}
내가 같은이 함수를 호출하고 싶은 다음 LogsOutput
클래스가 만들어지지 않습니다 때때로 그러나
LOUToutput() << "Print this line " << std::endl;
을, 따라서 포인터를 dereferencing 어떤 경우 파일 대신 오히려 출력 것이라고 추락 것입니다. 컴파일러가 컴파일시에 LogsOutput
클래스가 인스턴스화되는지 여부를 알 수 없으므로 템플릿 유형을 추론 할 수 없다는 것을 알지만, 작동시킬 수있는 다른 방법은 보이지 않습니다. 내 질문에 어떻게 내 함수를 런타임 조건에 따라 다른 형식을 반환 할 수 있습니다?
런타임에 유형을 구분해야하는 경우, 당신은 슈퍼 클래스를 반환하는 함수를 만드는 것으로 간주해야을, 관심이있는 런타임 조건에 따라 런타임에 해당 클래스의 두 하위 클래스 중 하나를 반환할까요? 템플릿 인스턴스화는 컴파일 타임에 발생하며 클래스의 특정 유형을 기반으로 호출 할 가상 메소드의 구현이 런타임에 수행됩니다. – AustinZ