我似乎记得我使用类型的大小来选择参数的值传递或引用传递.
就像是:
void fun( check<A> a ){ ... }
生成或:
void fun( A a ){ ... }
要么
void fun( A & a ){ ... }
取决于类型A的大小和编译应用程序的体系结构.
解决方法
在C 11中,您可以使用
std::conditional
:
#include <type_traits> class A { ... }; typedef std::conditional< std::is_trivially_copyable<A>::value && sizeof(A) <= sizeof(int),A,const A&>::type AParam; // Direct usage void f(AParam param); // Wrap into template class template <typename T> struct check: std::conditional<std::is_arithmetic<T>::value,T,const T&> {}; void f(check<A>::type param);
对于C 03编译器,您可以使用Boost实现 – Boost.TypeTraits library.
正如@sehe所提到的,还有Boost.CallTraits library正确实现了所需的功能:
#include <boost/call_traits.hpp> class A { ... }; void f(boost::call_traits<A>::param_type param);