私のクラスNは型Tとさまざまな量の型を取りますF...
実際に起こっていることはoperator()、関数参照とその関数が提供する引数を取るためにオーバーロードしていることです。バインド機能のようなものです。しかし、関数参照が を返すとき、その関数呼び出しの値を から取得voidできるようにしたくありません。そのため、関数参照の戻り値の型が の場合に何もしないようにforのオーバーロードを追加しましたが、エラーが発生するため、関数のシグネチャを正しく書き出していないと思います。std::coutoperator()operator<<std::coutvoid
#include <iostream>
#include <utility>
template <typename T>
struct N;
template <typename T, typename ... F>
struct N<T(F...)> {
T operator()(T (&t)(F...), F &&... f) {
return t(std::forward<F>(f)...);
}
};
template <typename ... T>
void operator<< (std::ostream &, const N<void(T...)> &) {}
// don't do anything when void
void f(int, int) {}
int main() {
N<void(int, int)> bind;
std::cout << bind(f, 5, 4); // errors
}
表示されるエラーは非常に長いため、投稿しません。これらは、 を返す関数で出力する場合の典型的なエラー メッセージですvoid。
を返す関数を出力しているため、上記のコードは失敗しますvoid。それが関数fです。私の過負荷はoperator<<何にも影響していないようです。ここで何が間違っていますか?さらに詳細が必要な場合は、そう言ってください。ありがとう。