1

コード

#include <iostream>

template <typename Type>
class MyContainer
{
private:
    Type contained;
public:
    MyContainer<Type>(Type & a): contained(a) { std::cout << "&\n"; }
    MyContainer<Type>(Type   a): contained(a) { std::cout << "_\n"; }
};

class Epidemic
{
private:
    int criticality;
public:
    Epidemic(int c): criticality(c);
};

int main()
{
    // using objects //
    Epidemic ignorance(10);
    MyContainer<Epidemic> testtube(ignorance); // should print "&"; error instead

    // using primitive //
    double irrationalnumber = 3.1415;
    MyContainer<double> blasphemousnumber(irrationalnumber); // should print "&"; error instead

    // using literal //
    MyContainer<double> digits(123456789.0); // prints "_"
}

説明

MyContainer<Type>(Type & a)ほとんどすべてのものを対象としています。ただし、リテラル (例: ) では機能しません1.732。そのため、 を追加しましたMyContainer<Type>(Type a)。ただし、これを追加すると、非リテラルはどちらのコンストラクターも使用できるため、あいまいになります。


質問

コンストラクターに与えられたすべてのパラメーター (リテラルと非リテラルの両方) を満たす方法はありますか?

4

1 に答える 1

2

値型パラメーターからconst参照に変更するだけです。

template <typename Type>
class MyContainer
{
private:
    Type contained;
public:
    MyContainer<Type>(Type & a): contained(a) { std::cout << "&\n"; }
    MyContainer<Type>(const Type& a): contained(a) { std::cout << "_\n"; }
                   // ^^^^^     ^
};
于 2016-11-02T19:18:46.220 に答える