C++编译时条件运行时语句
C++ Compile-Time Conditional Run-Time Statements
有没有办法在编译时决定两个运行时代码路径中的一个?我知道函数重载可以用来完成这一壮举,但代码大小会增加,因为我的两个函数都被编译并链接到程序中。有没有办法避免这种规模的开销?
本质上,我想做的是:
#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
可能只使用抽象类模板参数实例化,在这种情况下,只需要其中一个。
从您的示例来看,函数似乎是一个类的成员样板如果是这样的话,只有当它们实际上是习惯于如果过载解决方案总是选择其中一个,则另一个将永远不要实例化。
这是许多元编程技术的关键规则。它是在这种情况下,没有实例化的函数会如果它被实例化,则会导致编译时错误。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 建议在运行时将带有类实例的列表从c++导入qml
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 当我做出语句 root->right->right = newnode(7);注释,编译器显示运行时错误。谁能解释为什么?
- 在C程序中,如果在运行时忽略语句
- 使用条件语句在运行时选择不同的模板化矩阵类
- 如何使用 C 编程在运行时在 SQL 语句中传递文件路径
- if 语句运行时错误
- 添加 printf 语句时出现运行时错误
- C++编译时条件运行时语句
- 运行select语句时,Firebird ODBC驱动程序数据被截断