名前のないパラメータを使用して、単純な型のディスパッチャを作成していましたが、これはかなり普通のことです。一時変数を作成せずに名前のないパラメータを「渡す」ことは可能ですか?
実際に関数を呼び出すときは、変数を手に入れずにオーバーロードを取りたいと思っていました。出来ますか?
など。
void f1(int /*can change the type*/) {
}
int main(int, char*) {
f1(/*what to put here?*/);
return 0;
}
私の「本当の」例は単純なタイプベースのディスパッチャーでした。ベストは、名前のパラメータとしてポインタだったと私が思いついたものを、私はそれが少なくともオーバーヘッド可能性があると思う:
#include <iostream>
using namespace std;
template<typename U>
class A {
public:
A(const U& u) : u(u) {};
template <typename T>
T get_as() {
T* t; // <- ugly
return get(t);
}
U get(U*) {
return u;
}
int get(int*) {
return i;
}
double get(double*) {
return d;
}
private:
U u;
int i = 5;
double d = 3.14;
};
int main() {
A<string> a("name");
cout << a.get_as<double>() << '\n';
cout << a.get_as<int>() << '\n';
cout << a.get_as<string>() << '\n';
return 0;
}
私はそれはおそらく、最適化されますので、それは、ポインタで純粋に審美的だと思うが、それでも私は疑問に思います。私も、これは不可能かもしれないと思います。なぜなら、(AFAIK)この議論が積み重なるからです。技術的には常にこの「オーバーヘッド」があります。これは正しいですか?
これが別の質問であるべきかどうかはわかりませんが、トリッキーなことで「このオーバーロードを拾うだけです」と表現する方法はありますか?
PS。私はT*(0)
を「醜い」行に使うことができると考えましたが、それはおそらく読みにくいでしょう。
無名のパラメータは合法ですが、いくつかの特定の用途にすぎません:http://stackoverflow.com/questions/12186698/on-unnamed-parameters-to-functions-c – Baronz
@KerrekSB私の悪いです。私はもちろんパラメタを意味していました。編集されました。うまくいけばうまくいきます。 – luk32
@ luk32:ありがとう、はるかに明確です。 –