Если outfile << var << L"\n";
не удается скомпилировать, это потому, что var
относится к типу, который не имеет перегрузки, например:
std::wofstream& operator<<(std::wofstream&, const T&);
Если вы, например, попытаетесь передать std::string
в функция, которая может вызвать ту же ошибку.
Чтобы сделать ошибку понятнее для пользователя функции, вы можете использовать SFINAE только для создания экземпляра шаблона для поддерживаемых типов:
template<class T>
auto printtofile(const std::string& filename, int mode, T var,
const std::wstring& msg)
-> decltype(std::wofstream{} << var, void()) {
//...
}
Если вы сейчас попытаетесь использовать его с неподдерживаемым типом, ошибка будет выглядеть примерно так:
error: no matching function for call to
‘printtofile(..., int, <the offending type>, std::wstring&)’