1

有没有办法在编译时决定两个运行时代码路径之一?我知道可以使用函数重载来完成这一壮举,但随后代码大小会增加,因为我的两个函数都被编译并链接到程序中。有没有办法避免这种大小的开销?

本质上,我想做的是:

#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可能只使用抽象类模板参数实例化,在这种情况下,只需要其中一个。

4

1 回答 1

3

从您的示例中,看起来这些函数是类模板的成员。如果是这样,它们只有在实际使用时才会被实例化;如果重载决议总是选择其中之一,则永远不会实例化另一个。

这是许多元编程技术的关键规则。在这种情况下,未实例化的函数如果被实例化会导致编译时错误,这种情况并不少见。

于 2012-04-04T13:00:46.810 回答