gpt4 book ai didi

c++ - 是否可以使用 SFINAE 检测类方法的常量性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:49 24 4
gpt4 key购买 nike

考虑这个结构:

struct foo {
void dummy() const {}
};

是否可以使用 SFINAE 检测此方法的常量性?

例如,我想在可以在 static_assert 中使用的特征中捕获此属性:

static_assert(is_const_method<decltype(&foo::dummy)>::value, "Not const!");

我认为 std::is_conststd::remove_const 对我有帮助,但它们似乎不包含 的这种“类型”常量

谢谢,

最佳答案

当然,看起来像这样:

#include <type_traits>

template <class T>
struct is_const_method
: std::false_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...)>
: std::false_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) const>
: std::true_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) volatile>
: std::false_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) const volatile>
: std::true_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) &>
: std::false_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) const &>
: std::true_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) volatile &>
: std::false_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) const volatile &>
: std::true_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) &&>
: std::false_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) const &&>
: std::true_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) volatile &&>
: std::false_type
{
};

template <class R, class C, class ...T>
struct is_const_method<R (C::*)(T...) const volatile &&>
: std::true_type
{
};

struct foo {
void dummy() const {}
};

int main()
{
static_assert(is_const_method<decltype(&foo::dummy)>::value, "Not const!");
}

关于c++ - 是否可以使用 SFINAE 检测类方法的常量性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13992842/

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