2011-02-14 17 views
8

C++ türü önemsiz olarak kopyalanabilir olup olmadığını nasıl denetlerim? Memcpy ve memcmp işlevlerini belirtilen şablon T türünde kullanan bir sınıfım var ve memcpy ile kopyalamak için güvenli olmayan türler için itiraz etmek istiyorum. Bunu yapmak için herhangi bir yolu var mı (mevcut standart ile)?C++ is_trivially_copyable <a1> Çek</ a1>

+2

'is_pod' türünde bir özelliği kullanabilirsiniz. "Memcpy" ile kopyalamak için güvenli tanımınız nedir? Bir nesnenin, sahip olduğu dinamik olarak ayrılmış bir nesneyi işaret eden bir işaretçi veri üyesi varsa, "memcpy" ile kopyalamak güvenli midir? –

+0

@James: Tanım, önemsiz kopyalama yapıcısıdır - yani, kullanıcının tanımlı bir kopya oluşturucusu yok, ya da böyle bir temel sınıf veya veri üyeleri. – Puppy

+1

Standart "A kısaca kopyalanabilir bir sınıf bir sınıftır: - önemsiz olmayan kopya kurucular (12.8), vardır - önemsiz olmayan kopyalama atamaları operatörleri (13.5.3, 12.8), vardır - bir önemsiz yıkıcı (12.4). " – axe

cevap

8

Hayır, C++ 98/C++ 03'de mümkün değil. Bunun gibi şeyler C++ 0x'a neden <type_traits> eklenmiştir. <type_traits>'un bazı özellikleri, genellikle SFINAE ilkesini kullanarak C++ 03'te uygulanabilir, ancak std::is_trivially_copyable<T> da dahil olmak üzere birkaç tanesi yerleşik derleyici desteği gerektirir.

+0

Evet, bu benim de etkilendim. Teşekkürler. – axe

6

Bu işlem için çeşitli özellikler mevcut. Ancak, zaman harcamanızı ziyan ediyorsanız, bir tür, türünün tekdüze olarak kopyalanabiliyorsa, bir kopya yapıcı ile optimize edicinizin üreteceği hızdan daha hızlı olmayacaktır. Sadece kopya kurucuyu kullanın.

+0

İyi nokta. (diğer karakter) – aschepler

+0

Hangi tür özellikleri? is_pod tam olarak aradığım şey değil, çünkü Maxim'in neredeyse aynı olduğuna işaret etti. – axe

+0

_However, zaman harcamanızı harcıyorsanız, bir tür, kopyalayıcıyı tekdüze kopyalanabilirse, bir kopya oluşturucu ile üretecinizden daha hızlı olmayacak bir türden daha hızlı olmayacaktır. Sadece ben kopya constructor._ kullanın performans için değil, ben sadece benim sınıfın önemsiz olmayan kopya kurucu ile türleri için çalışmak istemiyorum. Bütün ayrılmaz tipler için uzmanlaşabilirdim, ancak POD'lar için çalışmayacak. – axe

İlgili konular