Ich versuchte, Logger mit C++ 11 Variadic Vorlagen zu tun, aber es funktioniert nicht für std::endl
, weil std::endl
Vorlage Funktion ist und der Compilator weiß nicht, welche Spezialisierung von std::endl
auszuwählen. Gibt es einen Weg, wie ich zwingen kann, immer std::endl<char, std::char_traits<char>>
auszuwählen? Wenn möglich, möchte ich direkt std :: endl verwenden.C++ 11 Variadische Vorlagen und Std :: Endl
EDIT: es sieht aus wie es derzeit nicht möglich, mit C++ 11 und und beste Weg ist, #define
zu verwenden oder was vsoftco beantwortet.
#include <iostream>
#include <string>
class Logger {
public:
template<typename T>
void log(T val);
template <typename T, typename ...Args>
void log(T val, Args... args);
};
// explicit specialization not working
template<>
void Logger::log(std::basic_ostream<char, std::char_traits<char>> (*modifier) (std::basic_ostream<char, std::char_traits<char>>)) {
std::cout << modifier;
}
template<typename T>
void Logger::log(T val) {
std::cout << val;
}
template<typename T, typename ...Args>
void Logger::log(T val, Args... args) {
log(val);
log(args...);
}
int main(int argc, char* argv[])
{
Logger log;
log.log("Nazdar ", "bazar ", "cau", std::endl, "kik"); // ERROR: cannot determine which instance of function template "std::endl" is intended
log.log("Nazdar ", "bazar ", "cau", std::endl<char, std::char_traits<char>>, "kik");
std::cin.get();
return 0;
}
@vsoftco: 'std :: flush' hat das gleiche Problem wie' std :: endl '. –
@vsoftco: dass die Verwendung wird nicht funktionieren Ursache 'std :: endl' ist kein Typ, es ist Template-Funktion – Krab
@Krab, Entschuldigung für die Verwirrung dieser ganzen Sache, ja, Sie sind absolut richtig. – vsoftco