C ++“if then else”模板替换

时间:2010-06-14 00:33:02

标签: c++ templates if-statement

我想声明一个模板如下:

template <typename T>
{ 
  if objects of class T have method foo(), then 
   const int k=1
  else 
   if class has a static const int L then
    const int k=L
   else 
    const int k=0;


}

我该怎么做?一般来说,我想要一个设置静态consts的机制 基于T的属性(或T中定义的typedef)。

3 个答案:

答案 0 :(得分:5)

外部部分当然很容易。使用boost :: mpl :: if_来决定从元函数返回哪个int_type,然后访问其中的值。没什么大不了的。

你试图找出类型X是否具有函数f()的部分仍然相当直接但不幸的是你找不到通用的答案。每当你需要这种检查时,你必须编写一个自定义元函数来找出它。使用SFINAE:

  template < typename T >
  struct has_foo
  {
    typedef char (&no)  [1];
    typedef char (&yes) [2];

    template < void (T::*)() >
    struct dummy {};

    template < typename S >
    static yes check( dummy<&S::foo> *);

    template < typename S >
    static no check( ... );

    enum { value = sizeof(check<T>(0)) == sizeof(yes)  };
  };

编辑:哦,用BOOST_MPL_HAS_XXX()

为你的静态const L创建一个检查器

答案 1 :(得分:0)

很难说当前形式的答案,因为问题领域不明确。

但是,您可以尝试使用type traits technique,它通过添加仅针对类型为T的对象的参数来增强模板化类。

我很确定,使用类型特征可以解决您的问题,仍然使用它们并编写/使旧例程通用有时会变得棘手。

答案 2 :(得分:0)

使用boost enable_if可以使用traits实现某些此类功能。但是因为C ++缺少像“这个类包含这个方法/成员吗?”这样的反思问题。 resolve

并不容易