是否可以将两个任意函数与 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::function
的target()
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 只是一种 callable,C++
中有很多不同的可能 callables。从功能的角度来看,指针相等有点弱。
【讨论】:
好吧,对于两个任意函数,它们是否计算相同的东西是不可判定的,那么您还希望什么呢?以上是关于是否可以将两个任意函数与 C++17 中的 std::any 进行比较?的主要内容,如果未能解决你的问题,请参考以下文章