首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用SFINAE来检测类方法的常量?

是否可以使用SFINAE来检测类方法的常量?
EN

Stack Overflow用户
提问于 2012-12-21 23:30:45
回答 2查看 202关注 0票数 4

考虑下面的结构:

代码语言:javascript
复制
struct foo {
  void dummy() const {}
};

是否可以使用SFINAE来检测此方法的稳定性?

例如,我想在一个可以在static_assert中使用的特征中捕获这个属性

代码语言:javascript
复制
static_assert(is_const_method<decltype(&foo::dummy)>::value, "Not const!");

我认为std::is_conststd::remove_const在这一点上会对我有所帮助,但它们似乎并不包含这种“类型”的constness。

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-21 23:41:49

当然,看起来是这样的:

代码语言:javascript
复制
#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!");
}
票数 12
EN

Stack Overflow用户

发布于 2012-12-21 23:42:13

您可以只使用部分专门化。

代码语言:javascript
复制
// false by default
template <typename Fun>
struct is_const_function : std::false_type {};

// breakdown member function type
template <typename Class, typename Result, typename... Args>
struct is_const_function<Result (Class::*)(Args...) const> : std::true_type {};
template <typename Class, typename Result, typename... Args>
struct is_const_function<Result (Class::*)(Args...) const volatile> : std::true_type {};
// consider ref-qualified ones for compilers that support it
template <typename Class, typename Result, typename... Args>
struct is_const_function<Result (Class::*)(Args...) const&> : std::true_type {};
template <typename Class, typename Result, typename... Args>
struct is_const_function<Result (Class::*)(Args...) const&&> : std::true_type {};
template <typename Class, typename Result, typename... Args>
struct is_const_function<Result (Class::*)(Args...) const volatile&> : std::true_type {};
template <typename Class, typename Result, typename... Args>
struct is_const_function<Result (Class::*)(Args...) const volatile&&> : std::true_type {};

您还可以添加更多的专门化,以迎合C风格的可变函数,但坦率地说,亲爱的,我不在乎。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13992842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档