我給自己寫了以下函式:
template <class Stream>
inline Stream& Print(Stream& in) { return in;}
template <class Stream, class Arg1, class... Args>
inline Stream& Print(Stream& sout, Arg1&& arg1, Args&&... args)
{
sout << arg1;
return Print(sout, args...);
}
替換以下代碼應該很有用:
cout << "This took " << ns << " seconds with " << np << " packets.\n";
和
Print(cout, "This took ", ns, " seconds with ", np, " packets.\n");
一切正常,除了這個函式不能“容忍”一些操縱器。有什么好笑的,只有其中一些。例如,如果用 替換," packets.\n"它將" packets.", endl不再編譯。雖然hexorsetw(20)很好。問題出在哪里?
uj5u.com熱心網友回復:
我無法解釋確切的原因,但如果我這樣做,它不會引發錯誤:
endl<char, char_traits<char>>
我的猜測是它似乎無法進行模板型別引數推斷。
ostream 是:
using ostream = basic_ostream<char, char_traits<char>>;
uj5u.com熱心網友回復:
std::endl是一個函式模板。
所以它不能被推斷為多載函式。
static_cast<std::ostream& (*)(std::ostream&)>(&std::endl)
會選擇正確的過載。
using Manipulator = std::ostream& (*)(std::ostream&);
Print(std::cout, "This took ", ns, " seconds with ", np, " packets.", Manipulator(std::endl));
演示
從 C 14 開始,您甚至可以不用助手對流型別進行硬編碼:
template <typename T>
struct ManipulatorImpl
{
ManipulatorImpl(T t) : t(t) {}
T t;
};
template <typename T>
std::ostream& operator << (std::ostream& os, ManipulatorImpl<T> m)
{
return m.t(os);
}
template <typename T>
ManipulatorImpl<T> make_ManipulatorImpl(T t) { return {t}; }
#define Manipulator(name) make_ManipulatorImpl([](auto& os) -> decltype((name)(os)) { return (name)(os); })
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/440814.html
