gpt4 book ai didi

c++11 可变参数模板和 std::endl

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:54 26 4
gpt4 key购买 nike

我尝试使用 C++11 可变参数模板做记录器,但它不适用于 std::endl ,因为 std::endl是模板函数,编译器不知道 std::endl 的特化选择。有什么办法可以强制始终选择 std::endl<char, std::char_traits<char>> ?如果可能的话,我想直接使用 std::endl。

编辑: 看起来目前在 C++11 中是不可能的,最好的方法是使用 #define或者 vsoftco 回答了什么。

#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;
}

最佳答案

实现相同目标的更简单的选择:

// 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");

关于c++11 可变参数模板和 std::endl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29324123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com