如何在使用SFINAE时忽略返回类型

问题描述 投票:0回答:1

我有这段代码:

template <typename T, typename R>
struct is_dereferenceable_exact
{
    typedef char yes;
    typedef struct { char dummy[2]; } no;

    template <typename U, R (U::*)() const>
    struct SFINAE;

    template <typename U>
    static yes  test(SFINAE<U, &U::operator*>*);

    template <typename U>
    static no   test(...);

    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

此结构用于检查给定类型是否可解除引用,并且解除引用的结果具有类型R。我使用省略号和sizeof而不是void_t或detect idiom的老方法明知 - 我想只使用C ++ - 03特征(如果可能的话)。

但我只是不能写出类似的结构,它只能确定T::operator*的存在而忽略了它的类型。你能帮助我吗?

UPD我可以概括一下我的问题:如果我可以使用返回类型编写一些特征,我可以像上面的引子一样消除它们吗?

c++ templates visual-studio-2013 sfinae
1个回答
5
投票

也许你也可以使用sizeof操作技巧:

#include <iostream>

template <typename T>
struct is_dereferenceable_exact
{
    typedef char yes;
    typedef struct { char dummy[2]; } no;

    template <int>
    struct SFINAE;

    template <typename U>
    static yes  test(SFINAE<sizeof(&U::operator*)>*);

    template <typename U>
    static no   test(...);

    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

struct A {
    int operator*() { return 0; }
};

struct B { };

int main() {
    std::cout << is_dereferenceable_exact<A>::value << std::endl;
    std::cout << is_dereferenceable_exact<B>::value << std::endl;
    return 0;
}

[live demo]

© www.soinside.com 2019 - 2024. All rights reserved.