我尝试使用C ++ 11可变参数模板执行记录器,但它不适用于std::endl
,因为std::endl
是模板函数,并且编译器不知道{{1}的特殊化1}}选择。有什么办法可以强制我总是选择std::endl
吗?如果可能,我想直接使用std :: endl。
编辑:目前看来C ++ 11目前无法使用,最好的方法是使用std::endl<char, std::char_traits<char>>
或 vsoftco 回答的内容。< / p>
#define
答案 0 :(得分:5)
实现相同目标的更简单选项:
// global or class member
enum MyEndl { my_endl };
// class member function
void log(MyEndl x) { std::cout << std::endl; }
用法:
log.log("Nazdar ", "bazar ", "cau", my_endl, "kik");
答案 1 :(得分:2)
我提出了这个问题,基本上是通过自定义包装器std::endl
重新定义my_endl
,使用默认模板参数。不是最优雅,但它确实起作用。当然,对于更多这样的操纵器,应该编写一个专门的包装器,但我想即使这可以通过更聪明的实现以某种方式实现。
#include <iostream>
#include <string>
#include <type_traits>
class Logger {
public:
template<typename T>
void log(T val);
template <typename T, typename ...Args>
void log(T val, Args... args);
};
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...);
}
template< class CharT = char, class Traits = std::char_traits<CharT> >
inline std::basic_ostream<CharT, Traits>& my_endl( std::basic_ostream<CharT, Traits>& os )
{
return std::endl(os);
}
// or, use the excellent (and better) suggestion by 0x499...,
// auto manip = std::endl<char, std::char_traits<char>>;
// log.log(..., manip)
int main(int argc, char* argv[])
{
Logger log;
log.log("Nazdar ", "bazar ", "cau", my_endl<>, "kik"); // ERROR: cannot determine which instance of function template "std::endl" is intended
log.log("Nazdar ", "bazar ", "cau", my_endl<>, "kik");
std::cin.get();
return 0;
}