私のクラスN
は型T
とさまざまな量の型を取りますF...
実際に起こっていることはoperator()
、関数参照とその関数が提供する引数を取るためにオーバーロードしていることです。バインド機能のようなものです。しかし、関数参照が を返すとき、その関数呼び出しの値を から取得void
できるようにしたくありません。そのため、関数参照の戻り値の型が の場合に何もしないようにforのオーバーロードを追加しましたが、エラーが発生するため、関数のシグネチャを正しく書き出していないと思います。std::cout
operator()
operator<<
std::cout
void
#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<<
何にも影響していないようです。ここで何が間違っていますか?さらに詳細が必要な場合は、そう言ってください。ありがとう。