如何将谓词函数作为模板参数传递?
How do i pass a predicate function as a template parameter?
我有一个简单的谓词:
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_1
和 list_2
的类型。
- 第二个参数表示谓词的名称。
- 第三个参数表示
list_1
和list_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
我该如何解决?
您的构造函数需要每个成员的默认构造函数。使用 成员初始值设定项列表。
my_containers(Type& tar_1, Type& tar_2, Predicate felt)
:ItemList_1(tar_1), ItemList_2(tar_2), predIcate(felt){}
首先:
- 尝试将构造函数定义为
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
class 没有任何默认构造函数,并且在您的 my_container
构造函数中,您必须显式初始化 predIcate
成员,否则它会尝试使用默认构造函数进行初始化'拥有它但编译失败。
所以需要在Member initialize list中初始化predIcate
或者为less_than
class定义默认构造函数。
我有一个简单的谓词:
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_1
和list_2
的类型。 - 第二个参数表示谓词的名称。
- 第三个参数表示
list_1
和list_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
我该如何解决?
您的构造函数需要每个成员的默认构造函数。使用 成员初始值设定项列表。
my_containers(Type& tar_1, Type& tar_2, Predicate felt)
:ItemList_1(tar_1), ItemList_2(tar_2), predIcate(felt){}
首先:
- 尝试将构造函数定义为
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
class 没有任何默认构造函数,并且在您的 my_container
构造函数中,您必须显式初始化 predIcate
成员,否则它会尝试使用默认构造函数进行初始化'拥有它但编译失败。
所以需要在Member initialize list中初始化predIcate
或者为less_than
class定义默认构造函数。