总的来说,我在理解函子方面遇到了一些困难,因为我对模板编程还比较新。
我的目标是编写一个函数,它接受一个Functor以及一个重载的函数,该函数接受一个值。
理想情况下:
template<typename ValueType>
int function(ValueType v)
{
v + 1;
...
}
template<typename Functor>
int function(Functor f)
{
f();
...
}
我愿意通过将std :: function作为参数之一来承担性能损失,但我特别希望能够将lambda作为参数。
编辑
我想要实现的是在必要时允许我正在构建的结构进行延迟评估:
construct.option(1)
construct.option([](){ return 5;})
construct.value()
使用构造函数选择在调用选项时获取哪个参数的值。(可能需要额外的参数来确定是否选择该选项)
要明确的是,一旦完成此选项调用,它就知道是否评估表达式。
另外,如果参数重载了()运算符,我想调用它,而不管它是否也重载了+1。
operator()
)来区分它们。 - gezafunction(x);
,目前无法确定应该选择哪个重载。有一些解决方法,但不确定是否值得这样做。你不能将其重命名为functionTakingValue
和functionTakingFunctor
吗? - 463035818_is_not_a_numberx
同时支持x+1
和x()
,那该怎么办呢?这两者并不是互斥的。这也是为什么有std::find
用于值类型和std::find_if
用于函数对象的原因。 - MSalters[](){ return x;}
。不确定,但是当启用优化时,我不会期望性能损失很大。 - 463035818_is_not_a_number