【问题标题】:How do i pass a predicate function as a template parameter?如何将谓词函数作为模板参数传递?
【发布时间】:2020-12-18 12:43:56
【问题描述】:

我有一个简单的谓词:

class less_than
{
  int  x;

public:
  less_than(int i):
    x(i)
  {
  }

  bool  operator()(int i) const
  {
    return i < x;
  }
};

我有一个看起来像这样的容器:

my_containers<std::list<int>, less_than, int> myCont(list_1, list_2, less_than(11));
  • 第一个参数表示list_1list_2 的类型。
  • 第二个参数表示谓词的名称。
  • 第三个参数表示list_1list_2的项目类型。

我尝试像这样创建我的模板:

template<class Type, class Predicate, class Item_Stored>
class my_containers
{
public:
  my_containers(Type &tar_1, Type &tar_2, Predicate felt)
  {
    ItemList_1 = tar_1;
    ItemList_2 = tar_2;
    predIcate  = felt;
  }

  my_containers & insert(const Item_Stored put_in)
  {
    if (!predIcate.operator()(put_in))
    {
      ItemList_1.insert(ItemList_1.end(), put_in);
    }
    else
    {
      ItemList_2.insert(ItemList_2.end(), put_in);
    }

    return *this;
  }

private:
  Type       ItemList_1;
  Type       ItemList_2;
  Predicate  predIcate;
};

每次我使用.insert(x) 时,如果它小于给定的less_than::x,它应该将x 添加到第一个列表中,否则添加到另一个列表中,但它会给我这个错误:

Error   C2512   'less_than': no appropriate default constructor available   

我该如何解决?

【问题讨论】:

  • ot: predIcate.operator()(put_in)predicate(put_in) 相同

标签: c++ templates predicate functor c++98


【解决方案1】:

您的构造函数需要每个成员的默认构造函数。改用成员初始化列表

    my_containers(Type& tar_1, Type& tar_2, Predicate felt)
        :ItemList_1(tar_1), ItemList_2(tar_2), predIcate(felt){}

参考:https://en.cppreference.com/w/cpp/language/constructor

【讨论】:

    【解决方案2】:

    首先:

    • 尝试始终将构造函数定义为explicit
    • 那么x.operator()()就等于x()
    • 并且始终使用成员初始化列表:
    struct A
    {
      double m_var;
    
      A(const double var) : m_var(var) {}
    };
    

    不是

    struct A
    {
      double m_var;
    
      A(const double var) 
      { 
        m_var = var;
      }
    };
    

    您的问题将得到解决。因为您的 less_than 类没有任何默认构造函数,并且在您的 my_container 构造函数中,您必须显式初始化 predIcate 成员,否则它会尝试使用没有它的默认构造函数进行初始化并且编译失败。

    所以你需要在成员初始化列表中初始化predIcate或者为less_than类定义一个默认构造函数。

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2012-12-27
      • 1970-01-01
      • 2017-06-14
      相关资源
      最近更新 更多