有没有办法在编译时决定两个运行时代码路径之一?我知道函数重载可以用来完成这个专长,但随后代码大小增加,因为我的两个函数都被编译并链接到程序中。有没有办法避免这种大小开销?
基本上,我想做的是:
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_abstract.hpp>
template <class T>
class X
{
public:
void copy_t(T &old_t)
{
//
// if T is abstract, (meaning that t is a pointer)
//
t = old_t.clone();
//
// else
//
t = old_t;
}
private:
typename boost::mpl::if_<boost::is_abstract<T>, T *, T>::type t;
};
我知道的唯一方法是重载成员函数:
template <class T>
class X
{
public:
void copy_t(T &old_t)
{
t = make_copy(old_t, t);
}
private:
T *make_copy(T &old_t, T *t)
{
return old_t.clone();
}
T &make_copy(T &old_t, T &t)
{
return old_t;
}
typename boost::mpl::if_<boost::is_abstract<T>, T *, T>::type t;
};
但是现在,两个make_copy
成员函数被编译并链接到程序中,即使X
只能用抽象类模板参数实例化,在这种情况下,只有其中一个是需要的。
答案 0 :(得分:3)
从您的示例中,看起来函数是类的成员 模板。如果是这样的话,只有实际它们才会被实例化 用过的;如果重载决策总是选择其中一个,则另一个会 永远不会被实例化。
这是许多元编程技术的关键规则。它的 在没有实例化的功能的情况下,这种情况并不罕见 如果它被实例化,会导致编译时错误。