相关疑难解决方法(0)

decltype(...,void())和void_t之间的区别

上次我找到了很多关于SFINAE的答案,建议使用void_t帮助器.

但我似乎并不明白它在以下方面有什么特别之处:

decltype (..., void()).
Run Code Online (Sandbox Code Playgroud)

考虑这个例子:

template <typename...>
using void_t = void;

template <typename T, typename = void>
struct has_foo : std::false_type {};

template <typename T>
struct has_foo <T, decltype (T().foo(), void())> : std::true_type {};

template <typename T, typename = void>
struct has_bar : std::false_type {};

template <typename T>
struct has_bar <T, void_t <decltype (T().bar())> > : std::true_type {};

class MyClass1
{
public:
    int foo() { return 3; }
};

class MyClass2
{
public:
    double bar() { return …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae

5
推荐指数
1
解决办法
541
查看次数

enable_if和自动返回类型?

我想使用type_traits通过shared_ptr进行过载。

struct A {
    A(int i) : x(i) {}
    int x;
};

int main()
{
    A a{4};
    auto b = std::make_shared<A>(7);
    A& c = a;
    A* d = b.get();
    A* e = &a;

    std::cout << getX(a) << std::endl;
    std::cout << getX(b) << std::endl;
    std::cout << getX(c) << std::endl;
    std::cout << getX(d) << std::endl;
    std::cout << getX(e) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是一种解决方案,但是存在必须预先定义返回类型的问题。

template <typename T>
typename std::enable_if_t<!boost::has_dereference<T>::value, int> getX(T t)
{
    return t.x;
}

template <typename T>
typename std::enable_if_t<boost::has_dereference<T>::value, int> …
Run Code Online (Sandbox Code Playgroud)

c++ type-traits enable-if

1
推荐指数
1
解决办法
64
查看次数

标签 统计

c++ ×2

enable-if ×1

sfinae ×1

type-traits ×1