gpt4 book ai didi

c++ - 如何存储/检索成员函数指针以用作模板参数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:54 25 4
gpt4 key购买 nike

出于元编程的目的,我想将成员函数指针存储在一个类型中,然后用它来参数化模板。

通过类比,这里有一个工作示例,说明如何将 int 存储在 integer_constant 类型中:

template< int I >
struct integer_constant {
static constexpr int value = I;
};

template <int I>
struct A {
// (client type, probably does other things with I)
static constexpr int value = I;
};

namespace {
using cStored= integer_constant<42>; // store value
static_assert(cStored::value == 42, "");

// ...

using aUseStored = A<cStored::value>; // use value as template parameter
static_assert(aUseStored::value == 42, "");
}

我可以用成员函数指针做同样的事情吗?如果不是,为什么不呢?

struct S{
void foo() {}
};

typedef void (S::*s_member_fn_type)();

template< s_member_fn_type M >
struct member_fn_constant {
static constexpr s_member_fn_type value = M;
};

template <s_member_fn_type M>
struct A {
// (client type, probably does other things with M)
static constexpr s_member_fn_type value = M;
};

namespace {
using cStored = member_fn_constant<&S::foo>; // store value

// clang is ok with the following line
// gcc 6.2: error: non-constant condition for static assertion
// gcc 6.2: error: '(s_member_fn_type)member_fn_constant<&S::foo>::value' is not a constant expression
static_assert(cStored::value == &S::foo, "");

// following line gives:
// clang 3.9.0 error: non-type template argument is not a pointer to member constant
// gcc 6.2: error: could not convert template argument 'member_fn_constant<&S::foo>::value' to 'void (S::*)()'
using aUseStored = A<cStored::value>; // use value as template parameter
//static_assert(aUseStored ::value == &S::foo, "");
}

我知道我可以通过传递包装器结构而不是函数指针来添加额外的间接级别,如下所示:

template <typename MT>
struct B {
static constexpr s_member_fn_type value = MT::value;
};

namespace {
using bUseStored = B<cStored>;
}

但是如果我的客户端类 A 已经被定义为采用成员函数指针,这就没有用了。

最佳答案

C++17 之前,指向成员函数的指针不是常量表达式。

从 C++17 开始,它是一个常量表达式,由 N4268 寻址.

clang 已通过 clang 3.5 中的 -std=c++1z 支持它,如您所见 C++ Support in Clang

g++ 声称它从 g++ 6 开始就支持它,但事实似乎并非如此,参见 C++ Standards Support in GCC

关于c++ - 如何存储/检索成员函数指针以用作模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40499393/

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