是否可以将两个任意函数与 C++17 中的 std::any 进行比较?

Posted

技术标签:

【中文标题】是否可以将两个任意函数与 C++17 中的 std::any 进行比较?【英文标题】:Will it be possible to compare two arbitrary functions with std::any in C++17? 【发布时间】:2017-04-13 10:43:36 【问题描述】:

我认为 C++ 如何处理函数指针和 std::function 的一个很大的限制是,目前不可能以优雅的方式比较两个不同类型的任意函数。

我现在想知道 C++17 是否会随着 std::any 的引入而改变这一点

void foo(int a) 
int bar(float b) 

void main()

    std::any oneFoo = std::make_any(foo);
    std::any oneBar = std::make_any(bar);
    std::any anotherFoo = std::make_any(foo);

    bool shouldBeFalse = (oneBar == oneFoo);
    bool shouldBeTrue = (oneFoo == anotherFoo);

这会像我预期的那样表现吗?

【问题讨论】:

Any reference 会明确表示它没有比较运算符。这将限制你可以投入的超出必要的范围。 所以即使使用 C++17 我们仍然没有优雅的跨平台方式来解决这个问题?该死的 嗯,总是有std::functiontarget() member function。除此之外,请注意函数标识在 C++ 中是一个模糊的概念。 那么您是否希望任何int(int) 匹配任何其他int(int) @N0vember 好吧,你可以这样做as long as they have the same type。如果他们没有你事先已经知道答案的相同类型,那么他们就是不相等的。 【参考方案1】:

比较函数指针很容易。你甚至不需要使用C++17,但它有助于缩短代码:

#include <iostream>

void foo(int a) 
int bar(float b)  return 0; 

template <class A, class B> bool pointer_equals(A *a, B *b) 
  if
    constexpr(std::is_same<A, B>::value)  return a == b; 
  else 
    return false;
  


int main(int, char *[]) 
  std::cout << "Should be false: " << pointer_equals(foo, bar) << "\n"
            << "Should be true: " << pointer_equals(foo, foo) << "\n";
  return 0;

问题是:functions 只是一种 callableC++ 中有很多不同的可能 callables。从功能的角度来看,指针相等有点弱。

【讨论】:

好吧,对于两个任意函数,它们是否计算相同的东西是不可判定的,那么您还希望什么呢?

以上是关于是否可以将两个任意函数与 C++17 中的 std::any 进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

C++/STL8. pair

C ++ 17中的typeid有反函数吗?

C ++ 20中的新线程(jthread)功能

C# 中的 C++ std::async 与异步/等待

在','C ++中拆分字符串[重复]

C/C++输入两个任意日期求相隔天数