Saya akan menyarankan untuk menggunakan sizeof(size_t)
(atau sizeof(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 juga trivialy_copyable
.
Berikut ini adalah demo C ++ 17:
#include <array>
#include <ccomplex>
#include <iostream>
#include <type_traits>
template <typename T>
struct maybe_ref
{
using type = std::conditional_t<sizeof(T) <= sizeof(size_t) and
std::is_trivially_copyable_v<T>, T, const T&>;
};
template <typename T>
using maybe_ref_t = typename maybe_ref<T>::type;
template <typename T>
class Foo
{
public:
Foo(maybe_ref_t<T> t) : _t(t)
{
std::cout << "is reference ? " << std::boolalpha
<< std::is_reference_v<decltype(t)> << std::endl;
}
private:
const T _t;
};
int main()
{
// with my machine
Foo<std::array<double, 1>> a{std::array<double, 1>{}}; // <- by value
Foo<std::array<double, 2>> b{std::array<double, 2>{}}; // <- by ref
Foo<double> c{double{}}; // <- by value
Foo<std::complex<double>> d{std::complex<double>{}}; // <- by ref
}