次のコードでは、コメント行をそのすぐ上の行と同じように機能させるにはどうすればよいですか?
テンプレートの適切なコンストラクタ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;
}
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;
ライブコード ここ 。