我有一个模板,我想根据参数的类型有条件地编译.我只关心区分"普通旧数据"(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
}}
Run Code Online (Sandbox Code Playgroud)
我一直在看升级库,我可以看到它们似乎有我想要的东西.但是,我不明白该#if语句的正确语法是什么.
任何帮助,将不胜感激.
编辑---在阅读回复后,我发现在我对问题的定义中忽略了一些内容.Class foo是一个模板化的类,只需要实例化的版本bar是正确的class type T.我一直在寻找一个可以在编译时解决的解决方案.希望这能解决我的问题.
您可以在没有enable_if的情况下执行此操作,因为您需要的是根据类型特征进行调度.enable_if用于向/从重载决策添加/删除模板实例化.您可能希望使用调用特征来选择将对象传递给函数的最佳方法.通常,对象应通过引用传递,而POD通过值传递.call_traits让你在const和非const引用之间进行选择.下面的代码使用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
}
};
Run Code Online (Sandbox Code Playgroud)