template
機能は機能ではなく、std::endl
の機能はtemplate
です。
template
関数を渡すことはできません。ただし、オーバーロードセットを表す関数オブジェクトを渡すことはできます。
struct endl_overloadset {
template<typename... Args>
auto operator()(Args&&...args)const
->decltype(std::endl(std::forward<Args>(args)))
{ return (std::endl(std::forward<Args>(args))) };
template<typename T,typename=typename std::enable_if<\
std::is_same< decltype(static_cast<T>(std::endl)), T >::value\
>::type>\
operator T() const { return std::endl; }
};
が、私はそれがあまりにも多くの決まり文句のようなビットであることがわかりましたので、あなたのために仕事をするいくつかのマクロを書く:このようファンクタを書くのはとても簡単です
#define RETURNS(X) ->decltype(X) { return (X); } // C++11 lacks non-lambda return value deduction
#define OVERLOAD_SET(F) struct {\
template<typename... Args>\
auto operator()(Args&&...args)const\
RETURNS(F(std::forward<Args>(args)...))\
template<typename T,typename=typename std::enable_if<\
std::is_same< decltype(static_cast<T>(F)), T >::value\
>::type>\
operator T() const { return F; }\
}
static OVERLOAD_SET(std::endl) Endl;
その後、Endl
を渡しますf
に送信し、Endl(Blah)
と電話するとstd::endl(Blah)
になります。同様に、Endl
を変数に代入するか、またはメソッドに渡すことは、基本的には変数にstd::endl
を代入するか、またはメソッドに渡します(オーバーロードの分解能)。
悲しいことに、ローカルタイプはtemplate
メソッドを持つことができないため、OVERLOAD_SET
は関数内で使用できません。関数内で使用できる場合は、
f(1,2,3, OVERLOAD_SET(std::endl)());
となります。しかし、それはあなたがプログラムしたい言語であり、あなたが持っている言語ではありません。 (さらに、マクロに頼るのではなく、[]
構文の乱暴な乱用を使用して自動的に過負荷設定ファンクタを生成できるようにする@ Xeoの提案が良いでしょう)。
Live exampleここで私は自分のendl_functor
をprint
という方法に渡してから、<<
をそれ以上利用することなく使用します。
したがって、narrow_endlのようなものではなく、通常の名前で修飾語を使用できるようにする方法はありませんか? – user697683
@ user697683 ostreamをラッピングする印刷機能を作成する場合は、書式設定のためのラッパー機能を導入することもできます(つまり、インターフェイスにostreamマニピュレータを使用せず、代替手段を提供することもできます)。しかし、あなたはo printの上に実装されたいくつかのprintfで終わるでしょう。これはおそらくC printfの上に実装されています。 – rubenvb