我有一个模板,我想根据参数的类型有条件地编译它。我只关心区分“普通旧数据”(POD),即整数等或类/结构。我在 Windows 上使用 c++ VS2008。
template<T>
class foo
{
void bar(T do_something){
#if IS_POD<T>
do something for simple types
#else
do something for classes/structs
#endif
}}
我一直在查看 boost 库,我可以看到它们似乎有我想要的东西。但是,我不明白正确的语法是什么#if
声明将是。
任何帮助,将不胜感激。
编辑 - -
阅读完回复后,我发现我忽略了问题定义中的一些内容。班级foo
是一个模板类,只需要实例化以下版本bar
这是正确的class type T
。我正在寻找一个可以在编译时解决的解决方案。希望这能解决我的问题。
你可以不用做启用如果,因为您所需要的只是根据类型特征进行调度。启用如果用于向重载解析添加/删除模板实例。您可能希望使用调用特征来选择将对象传递给函数的最佳方法。通常,对象应按引用传递,而 POD 则按值传递。呼叫特征让你选择const and 非常量参考。下面的代码使用const参考。
#include <boost/type_traits.hpp>
#include <boost/call_traits.hpp>
template <typename T>
class foo {
public:
void bar(typename boost::call_traits<T>::param_type obj) {
do_something(obj, boost::is_pod<T>());
}
private:
void do_something(T obj, const boost::true_type&)
{
// do something for POD
}
void do_something(const T& obj, const boost::false_type&)
{
// do something for classes
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)