1

誰かこれにふさわしいタイトルを教えてください。

質問がありますが、適切な英語での言い方がわかりません。だから私はいくつかの例でそれを尋ねます:

Double という名前の構造体があるとします。

struct Double
{
    // Declarations/Definitions here
}

そして、プライマリータイプのダブルとして使用されます。私のクラスには次のようないくつかの機能があることを除いて、ほぼ同じです。

void Double::event_serialize(Stream& stream);
String Double::event_representate();

そのため、このタイプ (およびその他) のラッパーを作成する必要がありました。

たとえば、次のような関数があります。

template<class T> void print(T value)
{
    std::cout << value.event_representate() << std::endl;
}

これで、次のような組み合わせで使用できます。

Double x = 3.14;
print(x);

しかし、次のように使用したい場合:

print(3.14);

コンパイラは次のようなことを行います。

const double __invis_value_1 = 3.14;

print(__invis_value_1);

右?

コンパイラーがそれを主要なタイプ double ではなく Double として検出することを (可能であれば) どうすれば確認できますか?

誰かが私を助けてくれることを願っています。前もって感謝します!

4

2 に答える 2

2

print次のように変換doubleするオーバーロードを指定できますDouble

void print(double value) {
    print<Double>(Double(value));
}

検討する可能性のある代替手段は、ユーザー定義のリテラルを使用することです。

inline constexpr Double operator"" _D(long double value) {
    return Double(value);
}

次に、次のように書くことができます。

 print(3.14_D);
于 2012-10-12T11:53:56.337 に答える
0

build in double をパラメーターとして受け取る Double のコンストラクターを作成すると、3.14 の例では暗黙的に double にキャストされます。デフォルト値を指定することもできます。

struct Double
{
    // Declarations/Definitions here
    Double(double value = 0.0);
}
于 2012-10-12T11:49:31.297 に答える