3

我最近开始使用 C++,我有一种强烈的冲动

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

这会在所有情况下正确执行吗?这是我所知道的唯一一种<<在 msg 中有 a 时会起作用的公式(例如"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;
}

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

4

4 回答 4

5

既然您提到您最近刚刚开始使用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';
于 2013-06-19T00:24:59.970 回答
3

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

于 2013-06-19T00:25:47.773 回答
2

只是为了好玩,这里有两个可变参数 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);
}

让我感兴趣的是,要完成这个简单的单行宏可以做什么,需要多少代码。

于 2013-06-19T03:40:01.763 回答
0

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

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

如果你想优化速度,我会在这里建议一个内联函数。

于 2013-06-19T00:25:55.607 回答