C++ 编译时条件运行时语句

标签 c++ template-meta-programming boost-mpl

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

本质上,我想做的是:

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

最佳答案

从你的例子来看,这些函数看起来像是一个类的成员 模板。如果是这样,它们只会在它们实际存在时被实例化 用过的;如果重载决策总是选择其中之一,则另一个将 永远不会被实例化。

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

关于C++ 编译时条件运行时语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10011569/

相关文章:

c++ - 在 'insert' 之后重新使用迭代器进入 vector

c++ - 提升 mpl::vector 和 hana

c++ - 如何将 std::tuple 类型与 boost::mpl 算法一起使用?

c++ - 循环遍历 mpl::map

android - 使用 gnu libstdc++ 编译 NDK 代码

c++ - "Duplicate symbol"小于 "-O2"

c++ - 编写应用程序以在没有托管代码的情况下与 SQL 2008 交互

时间:2019-03-17 标签:c++: how to remove cv-qualifiers of a type to access class functions?

c++ - 我可以在不编写自定义特征类的情况下对类型进行模式匹配吗?

c++ - 派生类模板化时访问基本成员数据错误