繁体   English   中英

#define print(msg)std :: cout << msg << std :: endl

[英]#define print(msg) std::cout << msg << std::endl

我最近开始使用C ++,我感到强烈的冲动

#define print(msg) std::cout << msg << std::endl

这会在所有情况下都能正确执行吗? 这是我所知道的唯一一个可以在msg中使用<< "foo" << myInt )的方法。 也不

#define print(msg) std::cout << (msg) << std::endl // note: parens

也没有建议的答案

template<typename T>
void print(T const& msg) {
    std::cout << msg << std::endl;
}

在这种情况下工作。 我也不关心用endl刷新输出的效率与仅使用\\n

既然你刚才提到你刚开始使用C ++ ,我想向你展示一个更好的语言提供的选择:

template<typename T>
void print(T const& msg)
{
    std::cout << msg << std::endl;
}

它需要任何类型的单个msg参数,并通过std::cout其流出。

正如评论中所提到的, std::endl不仅插入新行,还会刷新流。 这类似于printf冲洗\\n 如果您只想要一个新行,并且您可能会这样做,那么最好明确地做到这一点:

std::cout << msg << '\n';

这是非常主观的,但是您只需编写一次代码并多次阅读。 代码的其他维护者将想要了解你所编写的内容,所以只需编写std::cout << msg << std::endl 不要试图让C ++看起来像另一种语言。

只是为了好玩,这里有两个可变的C ++ 11 print实现:一个在参数之间插入空格,另一个不插入空格。 (住在ideone 。)

#include <iostream>

namespace with_spaces {

namespace detail {
std::ostream& print(std::ostream& os) {
    return os;
}

template <typename T>
std::ostream& print(std::ostream& os, T&& t) {
    return os << std::forward<T>(t);
}

template <typename T, typename U, typename... Args>
std::ostream& print(std::ostream& os, T&& t, U&& u, Args&&... args) {
    return print(print(os, std::forward<T>(t)) << ' ', std::forward<U>(u), std::forward<Args>(args)...);
}
}

template <typename... Args>
void print(Args&&... args) {
    detail::print(std::cout, std::forward<Args>(args)...) << std::endl;
}
}

namespace without {
namespace detail {
std::ostream& print(std::ostream& os) {
    return os;
}

template <typename T>
std::ostream& print(std::ostream& os, T&& t) {
    return os << std::forward<T>(t);
}

template <typename T, typename... Args>
std::ostream& print(std::ostream& os, T&& t, Args&&... args) {
    return print(print(os, std::forward<T>(t)), std::forward<Args>(args)...);
}
}

template <typename... Args>
void print(Args&&... args) {
    detail::print(std::cout, std::forward<Args>(args)...) << std::endl;
}
}

#include <iomanip>

int main() {
    std::cout << std::boolalpha;
    with_spaces::print(1, "foo", new int(3), 0xFFFFFFFFFFULL, 42, 0 == 1);
    without::print(1, "foo", new int(3), 0xFFFFFFFFFFULL, 42, 0 == 1);
}

我觉得有多少代码可以完成简单的单行宏可以做的事情。

宏被广泛使用,但不是很好的做法(特别是在C ++中),因为它们可以隐藏真正发生的事情,并且无法调试代码。

宏也绕过了预处理器的类型检查,并可能导致运行时问题。

如果您正在尝试优化速度,我建议使用内联函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM