আমি sizeof(size_t)
(বা sizeof(ptrdiff_t)
) যা আপনার মেশিনের সাথে সম্পর্কিত "আদর্শ" আকারটি প্রত্যাশার সাথে প্রত্যাশা করব যে এই আকারের যে কোনও ভেরিয়েবল একটি রেজিস্ট্রারের সাথে ফিট করে। সেক্ষেত্রে আপনি নিরাপদে এটি মান দ্বারা পাস করতে পারেন। তদুপরি, @ n314159 দ্বারা প্রস্তাবিত হিসাবে (এই পোস্টের শেষে মন্তব্যগুলি দেখুন) পরিবর্তনশীলটিও নিশ্চিত হয় তা নিশ্চিত করার জন্য এটি দরকারী trivialy_copyable
।
এখানে একটি সি ++ 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
}