gpt4 book ai didi

c++ - 每当采用给定的 SFINAE 构造函数时,定义一个派生自 true_type 的结构

转载 作者:行者123 更新时间:2023-11-27 22:52:53 25 4
gpt4 key购买 nike

请考虑以下代码片段:

template<typename T, class Tuple>
class vector
{
using size_type = typename Tuple::size_type;

template<typename... Elements,
typename = decltype(std::declval<Tuple>().reserve(size_type()))>
typename = decltype(std::declval<Tuple>().push_back(T())),
vector(Elements&&... elements)
{ /* ... */ }
};

我想定义一个嵌套结构 supports_reserve_push_back 派生自 std::true_type 只要上面的构造函数被启用(并且派生自 std::false_type 在另一种情况下)。

我该怎么做?

最佳答案

我修改了代码使其成为build .并据我所知实现了您要求的特征。

#include <iostream>
#include <type_traits>
#include <vector>
#include <map>

namespace example {

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

template<typename T, class Tuple>
struct vector {
using size_type = typename Tuple::size_type;
using tuple_type = Tuple;
using elem_type = T;

template<typename... Elements>
vector(Elements&&... elements)
{ /* ... */ }
};

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

template <class Vec>
struct supports_reserve_push_back<Vec, void_t<
decltype(std::declval<typename Vec::tuple_type>().reserve(typename Vec::size_type())),
decltype(std::declval<typename Vec::tuple_type>().push_back(typename Vec::elem_type())) >
>
: std::true_type {};

}

int main() {
std::cout
<< example::supports_reserve_push_back<example::vector<int, std::vector<int>>>::value
<< '\n'
<< example::supports_reserve_push_back<example::vector<int, std::map<int, int>>>::value;
return 0;
}

注意几点:

  1. 在负例中实例化类时,您最初编写 c'tor 的方式导致了硬错误。这就是我从 c'tor 中删除 chcck 的原因。

  2. 我建议您先定义类型特征,然后使用它们来启用您的 c'tor。

关于c++ - 每当采用给定的 SFINAE 构造函数时,定义一个派生自 true_type 的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35827828/

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