作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是定义一个Recursive
类,该类以int N
和一个或多个类型T, ...Ts
为模板,其行为应类似于std::pair
std::array
类型的N
项的T
作为first
,second
的,在相同std::vector
和其余模板参数Recursive
上模板化的N
实例的可选 Ts...
。 Recursive
的两个实例的别名),我没有不知道我是否对我上面描述的内容进行了错误的设计(或者它是不正确的描述!),或者我是否滥用了语言语法。
#include <array>
#include <boost/hana/fwd/optional.hpp>
#include <boost/hana/optional.hpp>
#include <string>
#include <utility>
#include <vector>
template <int N, typename T1, typename T2, typename ...Ts>
struct Recursive
: std::pair<std::array<T1, N>,
boost::hana::optional<std::vector<Recursive<N, T2, Ts...>>>> {};
template <int N, typename T>
struct Recursive<N, T> : std::array<T, N> {};
template<typename ...T>
using Recursive2 = Recursive<2u, T...>;
template<typename ...T>
using Recursive3 = Recursive<3u, T...>;
int main() {
using boost::hana::nothing;
Recursive2<int> x(std::make_pair(std::array<int, 2>{0,0}, nothing));
}
我将添加到目前为止已完成的一些故障排除。在下文中,模板指定似乎可以正常工作。
#include <iostream>
template <int N, typename T, typename ...Ts>
struct Recursive {
void operator()(){ std::cout << "general\n"; }
};
template <int N, typename T>
struct Recursive<N, T> {
void operator()(){ std::cout << "specialized\n"; }
};
template<typename ...T>
using Recursive2 = Recursive<2u, T...>;
template<typename ...T>
using Recursive3 = Recursive<3u, T...>;
int main() {
Recursive2<int>{}();
Recursive2<int>{}();
Recursive2<int,int>{}();
}
最佳答案
您有几个问题:
template <int N, typename T1, typename T2, typename ...Ts> struct Recursive;
至少需要3个参数。我认为这应该是特化,主要模板应该是:template <int N, typename T1, typename ...Ts>
struct Recursive;
template <int N, typename T> struct Recursive<N, T>
的行为不像std::pair
(在您声明要求时,否则用法是错误的),您可能想要以下内容:template <int N, typename T>
struct Recursive<N, T> : std::pair<std::array<T, N>, decltype(boost::hana::nothing)>
template <int N, typename T1, typename ...Ts>
struct Recursive;
template <int N, typename T1, typename T2, typename ...Ts>
struct Recursive<N, T1, T2, Ts...>
: std::pair<std::array<T1, N>,
boost::hana::optional<std::vector<Recursive<N, T2, Ts...>>>
>
{
using std::pair<
std::array<T1, N>,
boost::hana::optional<std::vector<Recursive<N, T2, Ts...>>>>::pair;
};
template <int N, typename T>
struct Recursive<N, T>
: std::pair<std::array<T, N>, decltype(boost::hana::nothing)>
{
using std::pair<std::array<T, N>, decltype(boost::hana::nothing)>::pair;
};
template<typename ...T>
using Recursive2 = Recursive<2u, T...>;
template<typename ...T>
using Recursive3 = Recursive<3u, T...>;
int main() {
using boost::hana::nothing;
Recursive2<int> x(std::make_pair(std::array<int,2>{0,0}, nothing));
}
Demo
关于c++ - 递归可变参数模板的基本案例特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64118868/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!