考虑下面的结构:
struct foo {
void dummy() const {}
};是否可以使用SFINAE来检测此方法的稳定性?
例如,我想在一个可以在static_assert中使用的特征中捕获这个属性
static_assert(is_const_method<decltype(&foo::dummy)>::value, "Not const!");我认为std::is_const或std::remove_const在这一点上会对我有所帮助,但它们似乎并不包含这种“类型”的constness。
谢谢,
发布于 2012-12-21 23:41:49
当然,看起来是这样的:
#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!");
}发布于 2012-12-21 23:42:13
您可以只使用部分专门化。
// 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风格的可变函数,但坦率地说,亲爱的,我不在乎。
https://stackoverflow.com/questions/13992842
复制相似问题