【问题标题】:Function Objects Set in C++C++ 中设置的函数对象
【发布时间】:2018-11-23 05:20:23
【问题描述】:

所以基本上我想创建一组 Function 对象。 如果我们这样做,在 python 中:

def func():
    print "a"

a = func
b = func
fset = set()
fset.insert(a)
fset.insert(b)

在这种情况下 fset 将只有一个函数,因为 a 和 b 在 python 中是相同的。 但是在 C++ 中,如果我为同一个函数创建函数对象,那么 a 和 b 将是一组的两个不同对象。有没有办法让两个功能相同的对象相同?

在 C++ 中:

void func(){
    cout << "a";
}

function<void()> a = bind(func);
function<void()> b = bind(func);

现在我想如果集合中已经存在 a 或其指针,则不应添加 b。

【问题讨论】:

  • ab 本质上是指向同一个对象的两个指针,而不是同一个类的两个实例。你可以有std::set&lt;std::function&lt;void()&gt;*&gt;,或者可能是一个智能指针——它的行为方式类似。
  • 但在这种情况下也每次创建函数指针 a = function();函数 b = 函数(); a 和 b 仍然会有不同的指针,对吧?
  • 一组,根据定义,包含彼此不同的值。当您建议将“相同的功能”作为两个不同的对象放入一个集合时,不清楚您在这里谈论的是什么。也许你应该用一些 C++ 代码来支持你的问题来说明你的问题。
  • 您说“创建指针”,但您的代码实际上并没有创建任何指针。也不清楚您所说的 function() 是什么意思 - 这在语法上似乎无效并且可能无法编译。
  • @IgorTandetnik 他们在谈论 your 评论,其中存储了std::function&lt;void()&gt;*

标签: c++


【解决方案1】:

如果您只有 void 函数(或所有函数具有相同的签名),请使用简单的 C 类型函数指针作为 std::sets 的模板类型。

这将起作用,而且没有std::function 的类型擦除开销。

void func() {}
void func2() {}

using fPtrType = void(*)(); // convenience type  

int main()
{
    std::set<fPtrType> fset;
    fPtrType a = func;
    fPtrType b = func;
    fset.emplace(a);
    fset.emplace(b);
    fset.emplace(func2);

    std::cout << fset.size();  // prints 2
    return 0;
}

【讨论】:

  • 如果 a 和 b 的作用域不同,这是否也有效?
  • @250 你是说this.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多