web-dev-qa-db-ja.com

テンプレート型の正しいコンストラクターを呼び出す方法は?

次のコードでは、コメント行をそのすぐ上の行と同じように機能させるにはどうすればよいですか?

テンプレートの適切なコンストラクタTypeを呼び出す汎用コードにしたいと思います。

#include <string>
#include <iostream>

template <typename Type>
struct Class
{
    Type data;
    Class(Type data) : data(data) { }
};

int main()
{
    Class<std::string> a = std::string("abc");
    // Class<std::string> b = "abc";
    std::cout << a.data << std::endl;
    return 0;
}
21
no one special

Classを変更できる場合は、テンプレート化された変換コンストラクターを追加できます。その後、例に書かれているようにコメント行をコンパイルすることができます。ただし、一般に、適切な理由なしに暗黙の変換を使用することはお勧めできません。これは、見つけにくいバグが発生する可能性があるためです( C++ Core Guidlines を参照)。

#include <string>
#include <iostream>

template <typename Type>
struct Class
{
    Type data;
    Class(Type data) : data(data) { }

    template<typename Other>
    Class(Other other_data) : data(other_data) {}
};


int main()
{
    Class<std::string> a = std::string("abc");
    Class<std::string> b = "abc";
    Class<std::string> c = a;

    std::cout << b.data << std::endl;
    return 0;
}

C++ 14を使用できる場合は、std::literals::string_literals::operator""sおよび変換コンストラクタを削除します。すると、あなたの行は次のようになります:

using namespace std::literals;

Class<std::string> b = "abc"s;

ライブコード ここ

0
florestan