Saya memiliki template yang terlihat seperti ini
template <typename T> class Foo
{
public:
Foo(const T& t) : _t(t) {}
private:
const T _t;
};
Apakah ada cara pemrograman cerdas template untuk menghindari menggunakan referensi const dalam kasus di mana jenis argumen sepele seperti bool atau char? Suka:
Foo(stl::smarter_argument<T>::type t) : _t(t) {}
Foo
.Jawaban:
Saya pikir sifat tipe yang tepat adalah
is_scalar
. Ini akan berfungsi sebagai berikut:Edit:
Di atas masih agak kuno, terima kasih @HolyBlackCat untuk mengingatkan saya pada versi yang lebih singkat ini:
sumber
is_fundamental
bekerja juga?= void
berarti memiliki tipe default yang batal, jadi menggunakansmarter_argument<T>
sebenarnyasmarter_argument<T, void>
. Saya tidak menyebutkan nama untuk argumen ini karena kami tidak membutuhkannya, karenanyaclass = void
tanpa nama. Penting bahwastd::enable_if_t
jika diaktifkan juga harus batal agar cocok dengan jenis default.template <typename T> using smarter_argument = std::conditional_t<std::is_scalar_v<T>, T, const T &>;
.Saya akan menyarankan untuk menggunakan
sizeof(size_t)
(atausizeof(ptrdiff_t)
) yang mengembalikan ukuran "khas" yang terkait dengan mesin Anda dengan harapan bahwa setiap variabel ukuran ini cocok dengan register. Dalam hal ini Anda dapat dengan aman menyampaikannya berdasarkan nilai. Selain itu, seperti yang disarankan oleh @ n314159 (lihat komentar di akhir posting ini) berguna untuk memastikan bahwa variabelnya jugatrivialy_copyable
.Berikut ini adalah demo C ++ 17:
sumber
struct Foo { void bar(){ }; int i; }; std::cout << sizeof(&Foo::i) << std::endl; //prints 8 std::cout << sizeof(&Foo::bar) << std::endl; //prints 16
<=
bukan==
, pada kebanyakan mesin kode Anda saat ini mengambilchar
contoh dengan referensi jika saya melihatnya benar.T
dapat disalin sepele. Sebagai contoh, sebuah pointer yang dibagikan hanya berukuran dua kali lipat darisize_t
pada plattform saya dan itu dapat diimplementasikan hanya dengan satu pointer, sehingga turun ke ukuran yang sama. Tapi Anda pasti ingin mengambil shared_ptr oleh const ref dan bukan dengan nilai.Saya akan menggunakan kata kunci C ++ 20
requires
. Seperti itu:Anda dapat menjalankan kode secara online untuk melihat output berikut:
sumber