2

関数 (fn) に char を渡したいと思います。int と short を型キャストしたくありません。したがって、値を MyInt (char のみをサポートする) に暗黙的にキャストしてから、fn に渡す必要があると考えます。これは機能するはずです。bc IIRC では、関数に渡すときに typcast が 1 つだけ許可されます (したがって、char->MyInt は問題ありませんが、int->char->MyInt は問題ありません)。

ただし、 int と char の両方が機能しているように見えるので、別の間接レイヤー(MyInt2)で修正されると思います。現在、それらは両方ともfnに渡すことができません... intではなくcharを渡す方法はありますか?

#include <cstdio>
struct MyInt2{
    int v;
    MyInt2(char vv){v=vv;}
    MyInt2(){}
};
struct MyInt{
    MyInt2 v;
    MyInt(MyInt2 vv){v=vv;}
};
void fn(MyInt a){
    printf("%d", a.v);
}
int main() {
    fn(1);       //should cause error
    fn((char)2); //should NOT cause error
}
4

3 に答える 3

11

救助への関数テンプレート

template<typename T> void fn(T t);

void fn (char a){
    printf("%c", a);
}

fn誰かが引数以外のものを呼び出そうとするとchar、関数テンプレートが一致するものとして選択され、リンカーは適切な特殊化が見つからないと文句を言います。

于 2012-07-11T10:21:05.767 に答える
9

ポリモーフィズムを使用して、いくつかのバージョンを定義して、1 つを受け入れintたり、1つを受け入れたりshort、例外をスローしたり、アサーションの失敗を引き起こしたり、コンストラクターを非表示にしたりできます。

struct MyInt2{
    int v;
    MyInt2(char vv){v=vv;}
    MyInt2(short s) { throw "short"; } /* exception, runtime error */
    MyInt2(){}
    private:
    MyInt2(int v) { } /* hidden, compile time error */
};
于 2012-07-11T10:18:43.167 に答える
4

char暗黙的に which に変換しMyInt2、次に に変換しますMyInt。ただし、言語仕様では 2 レベルの変換は許可されていません。

1 レベルの暗黙的な変換を行いたい場合は、C++1 が役に立ちます。

C++11 では、次のようにdelete取るコンストラクターをint許可することができますchar

struct MyInt{
    int v;

    MyInt(char vv) : v(vv) {} //use mem-initialization list

    MyInt(int) = delete;  //VALID only in C++11
};

を取る削除されたコンストラクタに注意してください。これはint次のことを意味します。

MyInt m1(10); //error - can't accept int!

MyInt m2((char)10); //okay - can accept char!

オンラインデモを見る

実際、次のようなdeleteものを除くすべてのコンストラクターを使用できますchar

struct MyInt{
    //..
    MyInt(char vv); //ALLOW
 
    template<typename T>
    MyInt(T) = delete;  //DELETED the rest!
};

デモ

の詳細:

それが役立つことを願っています。

于 2012-07-11T10:42:01.833 に答える