gpt4 book ai didi

c++ - 依赖于模板参数的成员函数实现

转载 作者:太空狗 更新时间:2023-10-29 20:54:13 27 4
gpt4 key购买 nike

我有以下问题:

template< typename T, size_t N, size_t... N_i >
class A
{
public:

// ...

// first implementation
template< size_t M = sizeof...(N_i)+1, typename std::enable_if< M!=1, size_t >::type = 0 >
A<T, N_i...> operator[]( size_t i )
{
A< T, N_i... > res{ ... };

return res;
}

// second implementation
template< size_t M = sizeof...(N_i)+1, typename std::enable_if< M==1, size_t >::type = 0 >
T operator[]( size_t i )
{
return ... ;
}
};

正如您在上面看到的,我尝试实现一个类 A它期望作为模板参数类型 T (例如 intfloat )和 sizeof...(N_i)+1 -很多size_t .

取决于通过的次数size_t (即 sizeof...(N_i)+1 ),我将为成员函数 operator[](size_t) 使用不同的实现具有不同的结果类型:

  • 案例的一个实现 sizeof...(N_i)+1 > 1返回类型 A < T, N_i... >(代码中称为“第一次实现”)
  • 和一个案例sizeof...(N_i)+1 == 1返回类型 T(在代码中称为“二次实现”)。

不幸的是,我不知道如何实现——上面的解决方案不起作用。有人有想法吗?

非常感谢。

最佳答案

A<T, N_i...>对空 N_i 无效.作为解决方法,您可以使用间接寻址:

template <typename, std::size_t ...>
struct PopFrontA
{
using type = void; // Dummy type for A<T, N>
};

template< typename T, std::size_t N, std::size_t... N_i > class A;

template <typename T, std::size_t N, std::size_t N2, std::size_t ... Ns>
struct PopFrontA<T, N, N2, Ns...>
{
using type = A<T, N2, Ns...>;
};

template <typename T, std::size_t ... Ns>
using PopFrontA_t = typename PopFrontA<T, Ns...>::type;

然后

// first implementation
template< size_t M = sizeof...(N_i)+1, typename std::enable_if< M!=1, size_t >::type = 0 >
PopFrontA_t<T, N, N_i...>
operator[]( size_t i )
{
A< T, N_i... > res{ /*...*/ };

return res;
}

Demo

关于c++ - 依赖于模板参数的成员函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40025248/

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