コンパイル時に、2つのランタイムコードパスのいずれかを決定する方法はありますか?この偉業を達成するために関数のオーバーロードを使用できることは知っていますが、両方の関数がコンパイルされてプログラムにリンクされているため、コードサイズが大きくなります。このサイズのオーバーヘッドを回避する方法はありますか?
基本的に、私がやりたいことは次のとおりです。
#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;
};
しかし現在、2つのmake_copy
メンバー関数がコンパイルされ、プログラムにリンクされています。ただしX
、抽象クラステンプレートパラメーターを使用してインスタンス化することはできますが、その場合は、そのうちの1つだけが必要です。