C ++ - std :: enable_if用于更多类型

时间:2016-12-09 07:35:10

标签: c++ c++11 templates

我有一个功能:

template <typename T,
  typename std::enable_if <std::is_same<T, int>::value == true>::type* = nullptr>
void test(T i)
{
   //process data
}

有效。

但是,我不仅要为int启用此功能,还要为floatconst char *启用此功能...如何在不编写相同方法的情况下执行此操作3次?

3 个答案:

答案 0 :(得分:11)

像这样:

template <typename T,
  typename std::enable_if <std::is_same<T, int         >::value ||
                           std::is_same<T, float       >::value ||
                           std::is_same<T, const char *>::value>::type* = nullptr>
void test(T i)
{
   //process data
}

答案 1 :(得分:3)

C ++ 17的通用解决方案(在godbolt.org上查看)

databaseRef.child("Likes").child(*key*).addListenerForSingleValueEvent(new ValueEventListener() {

      @Override
      public void onDataChange (DataSnapshot dataSnapshot) {
        dataSnapshot.getChildrenCount(); <- like count
      }

      @Override
      public void onCancelled (DatabaseError databaseError) {

      }
    });

答案 2 :(得分:1)

另一种通用解决方案是使用std :: disjunction(C ++ 17)来执行逻辑OR。允许类型在调用测试函数时指定为模板参数,或者您可以为特化定义typedef。

sdo_geom.sdo_area(geometry, 0.005, 'unit=SQ_MILE')

run the code