当然:
template<typename T, bool=true>
struct eff_arg {
typedef T type;
};
template<typename T>
struct eff_arg<T, (sizeof(T)>sizeof(int))> {
typedef T const& type;
};
// C++11 addition
template<typename T>
using EffArg = typename eff_arg<T>::type;
利用:
template <class T> class tmplClass
{
// C++11
void doSomething(EffArg<T> input);
// C++03
void doSomething(typename eff_arg<T>::type input);
};
并替换sizeof(int)
为您想要用作“您想要作为参考而不是按值传递的点”的任何类型。
请注意,参数的大小是做出此决定的一种平庸的方式:一个极小的类(甚至比指针还小!)可能具有深度复制语义,其中一个大型结构在复制时会被复制。并且通常截断不应该是大小int
或指针,而是大于那个,因为间接具有成本。
一个想法可能是只复制不管理资源且足够小的对象。 当您不需要数据副本时,可能是您在传递 a而不是 astd::is_trivially_copyable<T>::value && (sizeof(T) <= 2*sizeof(void*))
之前应该进行的那种检查。T
T const&
这导致以下情况:
template<typename T, bool=true>
struct eff_arg {
typedef T const& type;
};
template<typename T>
struct eff_arg<T,
std::is_trivially_copyable<T>::value
&& (sizeof(T)<=2*sizeof(void*))
> {
typedef T type;
};
template<typename T>
using EffArg = typename eff_arg<T>::type;