Próbowałem zrobić logger przy użyciu szablonów variadic C++ 11, ale to nie działa dla std::endl
, ponieważ std::endl
jest funkcją szablonu, a kompilator nie wie, jaką specjalizację z std::endl
, aby wybrać. Czy istnieje sposób, w jaki mogę wymusić na zawsze wybranie std::endl<char, std::char_traits<char>>
? Jeśli to możliwe, chcę użyć bezpośrednio std :: endl.C++ 11 szablony variadic i std :: endl
EDIT: wygląda na to, że nie jest obecnie możliwe w C++ 11 i i najlepszym sposobem jest użycie #define
lub co vsoftco odpowiedział.
#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' ma ten sam problem co' std :: endl '. –
@vsoftco: to użycie nie zadziała, ponieważ 'std :: endl' nie jest typem, jest to funkcja szablonu – Krab
@Krab, przepraszam, że zepsułem to wszystko, tak, jesteś absolutnie poprawny. – vsoftco