【问题标题】:More general way to find if a type has a certain member?查找类型是否具有特定成员的更通用方法?
【发布时间】:2018-02-24 18:51:20
【问题描述】:

我正在尝试制作一些东西来告诉我一个类型在编译时是否具有某个函数/变量。我知道发布了解决方案,但这些都需要复制粘贴或宏来进行每次不同的检查。我想知道是否有更通用的方法来做到这一点。

也许语法如下:

bool has_certain_member = has<type, member>::value;

相对于:

DEFINE_MEMBER_CHECK(member)

bool has_certain_member = CHECK_FOR_MEMBER(type);

其中 DEFINE_MEMBER_CHECK 定义了一个帮助器类型来检查该特定成员,而 CHECK_FOR_MEMBER 获取特定类型的值。

有没有办法将指向成员的指针作为模板参数传递?或者您可能会将它作为参数传递给 constexpr 函数?

【问题讨论】:

  • 您需要对此进行反思。我们目前没有反射

标签: c++ templates metaprogramming template-meta-programming


【解决方案1】:

这就是is_detected 的用途

#include<experimental/type_traits>

template<typename T>
using foo_t = decltype(std::declval<T>().foo());

template<typename T>
constexpr bool has_foo = std::experimental::is_detected_v<foo_t, T>;

并将其用作

struct Fooer { void foo() {} };
struct Barer { void bar() {} };

void test()
{
    static_assert(has_foo<Fooer>);
    static_assert(!has_foo<Barer>);
}

Live

【讨论】:

  • 我认为这是 OP 已经知道的。来自问题:我知道发布了解决方案,但这些都需要复制粘贴或宏来进行每次不同的检查。。我不认为这个解决方案可以摆脱重复。
  • @liliscent 鉴于其工作的灵活性,这是尽可能少的重复。上面的 sn-p 询问是否有一些函数 foo 不接受任何参数,您必须在 somewhere 编写该规范。将其包装在宏中几乎可以满足 OP 在后半部分的要求
  • 答案应该是不可能。请仔细阅读OP的帖子,尤其是“而不是:”那部分,你的答案与要求完全相反。
  • @liliscent 我将其读为:“后半部分具有正确的功能,但是是宏”。这里没有宏
  • 是的,我相信这很简单。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多