gpt4 book ai didi

c++ - 我想要一个带有指向成员的指针的模板函数,但我不想传递类类型或成员类型

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:23 24 4
gpt4 key购买 nike

所以我一直在绞尽脑汁想找出解决问题的方法。我想我会把它贴在这里看看是否有人有任何想法。请考虑以下事项:

template <typename S, typename T, T S::* pMember>
bool SortByMember(const S& L, const S& R)
{
return L.*pMember < R.*pMember;
}

...

struct SomeStruct
{
int SomeMember;
};

void SomeFunction(void)
{
GetSortByMember<&SomeStruct::SomeMember>();
}

我希望函数 GetSortByMember 返回指向 SortByMember 的相应实例的函数指针。但是,我想不出一种以不需要用户也传递类类型和成员类型的方式来声明/定义 GetSortByMember 的方法。这:

GetSortByMember<SomeStruct, int, &SomeStruct::SomeMember>();

过于冗长,需要我说明成员类型。我确信 boost 库中可能有一个解决方案,但我不想将这种依赖性引入我正在处理的项目中。

我非常怀疑是否有一种解决方案可以产生我在伪代码中使用的确切语法,但也许可以使用模板类或宏来完成某些事情?

将使用函数指针的类需要 SortByMember 的签名,因此无法更改。

最佳答案

可能有更好的方法来做你想做的事,但这可以使用宏和 GCC 特定的 typeof()。我不确定,但在新的 C++ 标准中可能有一种可移植的方法来执行 typeof。

#include <iostream>

template <class P, P p>
class sort_by_member_t;

template <class S, class T, T S::*p>
class sort_by_member_t<T S::*, p> {
public:
typedef bool (*fn_t)(S const&, S const&);

static bool fn(S const& L, S const& R)
{
return L.*p < R.*p;
}
};

#define SORT_BY_MEMBER(p) sort_by_member_t<typeof(p), p>::fn;

struct SomeStruct
{
int SomeMember;
};


int main()
{
bool (*fp)(SomeStruct const&, SomeStruct const&);
fp = SORT_BY_MEMBER(&SomeStruct::SomeMember);
SomeStruct const a = { 1 };
SomeStruct const b = { 2 };
std::cerr
<< (void*) fp << ' '
<< (*fp)(a, b) << ' '
<< (*fp)(b, a) << ' '
<< '\n';

return 0;
}

关于c++ - 我想要一个带有指向成员的指针的模板函数,但我不想传递类类型或成员类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8058197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com