web-dev-qa-db-fra.com

Comment appeler le bon constructeur d'un type de modèle?

Dans le code suivant, comment puis-je faire fonctionner la ligne commentée de la même manière que la ligne juste au-dessus?

Je voudrais en faire un code générique, qui appelle le constructeur approprié d'un modèle 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

Si vous pouvez modifier votre Class, vous pouvez ajouter un constructeur de conversion basé sur des modèles. Ensuite, vous pourrez compiler la ligne commentée comme écrit dans votre exemple. Notez cependant qu'il n'est généralement pas recommandé d'utiliser des conversions implicites sans raison décente car elles peuvent entraîner des bugs difficiles à repérer (cf. les 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;
}

Si vous pouvez utiliser C++ 14, vous pouvez utiliser le std::literals::string_literals::operator""s et supprimez le constructeur de conversion. Ensuite, votre ligne ressemblerait à ceci:

using namespace std::literals;

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

Code en direct ici .

0
florestan