を返す私は、戻り値の型のオーバーロードのための構造体を使用してのトリックを知っている:は、パラメータの両方の機能をオーバーロードし、種類
struct function {
operator typeA() { return overloadForTypeA(); }
operator typeB() { return overloadForTypeB(); }
}
問題は、このパラメータとパラメータの型のオーバーロードを無効にしていることです。だから私はテンプレートを使用してこの概念を拡張しようとしてきた:
struct function {
//template on the constructor so types are inffered from arguments
template<typename... Args>
funct(Args... arguments) { myArguments = arguments; }
//intermediate storeage of arguments, problem is the template doesn't extend to here
Args myArguments;
//overloads for return type int
int overloadForInt(char* chr) { return 20; }
int overloadForInt(int i) { return 4; }
//overloads for return type char
char overloadForChar(char* chr) { return 'c'; }
char overloadForChar(int i) { return 'i'; }
//implcit cast operators to archive return type overloading
operator int() { return overloadForInt(myArguments...); } //if myArguments doesn't match any overload of overloadForInt compile error should happen
operator char() { return overloadForChar(myArguments...); }
}
ご覧のように、私はstuctの残りの部分まで延びていないテンプレートの問題に遭遇しました。この特定の問題を解決するために構造体全体にわたってコンストラクタテンプレートを拡張する方法はありますか?または、パラメータとパラメータ型のオーバーロードを維持しながら、戻り型をオーバーラップ可能にする別の方法がありますか?
「無効なパラメータとパラメータのタイプのオーバーロード」という意味をもう少し説明してください。 – linuxfever
クラスそのものを 'Args ...'(または任意の名前)をとるテンプレートにします。 – 0x499602D2
"パラメータを無効にする..."とは、暗黙のキャストは何も取らないので、引数を渡すことはできません。また、私は構造体そのものをテンプレートにすることはできません。なぜなら、引数の型はコンストラクタから入力されないので、 "function(parameters)"の代わりに "function(parameters)"です。 。これは、通常の機能と同じ構文を持つという目的を破るものです。 (その後、ダミーポインタを使用するほうがよいでしょう) –