gpt4 book ai didi

c++ - 将成员元组传递给非成员结构而不在模板中指定它

转载 作者:行者123 更新时间:2023-11-28 02:11:11 25 4
gpt4 key购买 nike

为了避免 XY 问题,我有一个带有异构容器的类,基本上是 std::tuple。我想让这个类能够接受访问者,将它们应用于元组的每个元素(不确定我是否静态应用它)。访客的访问功能将被模板化,因此他们将能够充分利用某些类型的特化。

问题:

当我想应用 Visitor 时,我需要遍历一个容器,获取有关 Visitor、元组和即将访问的元素索引的信息。但是当我想创建成员函数时,我发现我不能部分特化它。这是我想出的解决方案,但我想以某种方式传递元组而不在模板参数中指定包含元组的类型。

#pragma once
#include <tuple>
#include <functional>

template <typename Visitor, int N, typename ... DataTypes>
struct Extractor
{
static void applyVisitor(Visitor& v, std::tuple<DataTypes...>& t)
{
Extractor<Visitor, N - 1, DataTypes...>::applyVisitor(v, t);
v.visit(std::get<N>(t));
}
};

template <typename Visitor, typename ... DataTypes>
struct Extractor <Visitor, 0, DataTypes...>
{
static void applyVisitor(Visitor& v, std::tuple<DataTypes...>& t)
{
v.visit(std::get<0>(t));
}
};

template <typename ... DataTypes>
class MyTuple
{
std::tuple<DataTypes...> data;
public:
MyTuple(std::tuple<DataTypes...> data_) : data(data_) {}

template <typename Visitor>
void acceptVisitor(Visitor& v)
{
Extractor<Visitor, sizeof...(DataTypes) - 1, DataTypes...>::applyVisitor(v, data);
}
};

我在考虑 OOD,因此每个对类数据进行操作的函数最好是成员函数,但 C++ 模板似乎来自另一个世界。如果我做的不对,请提出其他解决方案。

编辑:

如评论中所述,这里是访问者和客户端调用 acceptVisitor()

的示例

访客

#pragma once
#include <iosfwd>

class Visitor
{
std::ostream& os;
public:
Visitor(std::ostream& outputStream) :os(outputStream) {}

template <typename T>
void visit(T& data)
{
std::cout << data << "\n";
}
};

主要

#include "HeteContainer.h"
#include "Visitor.h"
#include <iostream>
#include <string>
#include <cstdlib>

int main()
{
Visitor v(std::cout);
MyTuple<int, int, std::string> m({ 1, 1, "abc" });
m.acceptVisitor(v);

std::system("pause");
}

最佳答案

您可以避免递归并改用 std::index_sequence:

template <typename Visitor, typename... DataTypes, std::size_t... Idx>
void applyVisitor(Visitor& v, std::tuple<DataTypes...>& t, std::index_sequence<Idx...>)
{
using expander=int[];
(void)expander{ (v.visit(std::get<Idx>(t)), 0)... };
}

然后你的acceptVisitor函数变成这样:

template <typename Visitor>
void acceptVisitor(Visitor& v)
{
applyVisitor(v, data, std::index_sequence_for<DataTypes...>{});
}

Live Demo

关于c++ - 将成员元组传递给非成员结构而不在模板中指定它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35627348/

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