Şablon türünün doğru yapıcısını nasıl çağırırım?


21

Aşağıdaki kodda, yorumlanan satırın hemen üstündeki satırla aynı şekilde çalışmasını nasıl sağlayabilirim?

Ben genel bir kod yapmak istiyorum, bu bir şablonun uygun yapıcı çağırır 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;
}

Yanıtlar:


14

Doğrudan başlatma kullanın:

Class<std::string> b("abc");

17

Kullanım çaprazlı-init-listesi (ya da tek-başlangıcı) örneğini initlize için Class.

Class<std::string> a{ std::string("abc") };  // works
Class<std::string> b{ "abc" };               // also works

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

olan kopyalamaya karşı başlatma . İki kullanıcı tanımlı dönüşüm içereceğinden çalışmaz:

  • dan const char*üzere std::string,
  • ' std::stringden Class<std::string>.

Ancak en fazla bir tanesine izin verilir.

Yazdığın zaman

Class<std::string> b("abc");
// or
Class<std::string> b{"abc"};

Kullanmak direkt başlatma . Çalışıyor çünkü artık yalnızca bir kullanıcı tanımlı dönüşüm kullanılıyor:

  • ' const char*den std::string.

0

'Nizi değiştirebiliyorsanız Class, şablonlanmış bir dönüştürücü kurucu ekleyebilirsiniz. Ardından, yorum yapılan satırı örneğinizde yazıldığı gibi derleyebilirsiniz. Bununla birlikte, nokta zor hatalara neden olabileceğinden, örtük dönüşümlerin iyi bir sebep olmadan kullanılması önerilmez ( c ++ Çekirdek Yönergeleri ).

#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 kullanabiliyorsanız std::literals::string_literals::operator""s, dönüştürme yapıcısını kullanabilir ve kaldırabilirsiniz. Sonra, hattınız şöyle görünecektir:

using namespace std::literals;

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

Canlı kod burada .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.