【发布时间】:2015-04-22 15:27:23
【问题描述】:
我有课
class C
{
public:
C() {}
private:
int timesTriggered_;
std::map<std::string, std::tuple<std::string, int, int, int, int, int>> mapST;
std::vector<std::string> sv;
};
还有这种类型的一些对象:
C c1;
C c2;
C c3;
我有一张由 C 类字符串索引的地图
std::map<std::string, std::list<C>> cMap;
我将一些 C 类的对象添加到地图中
cMap["1"].push_back(c1);
cMap["2"].push_back(c2);
cMap["3"].push_back(c3);
我需要一个函数,当通过 std::list 时将返回(例如三个元素)一个
std::tuple<C&, C&, C&>(c1, c2, c3)
尽管这需要返回一个 std::tuple,但元组的项目总是相同的类型,C。无论列表中有多少项目,这都必须工作,尽管编译时的 C 对象数量很好。所以本质上这将一个列表(元素数量的上限)变成了一个可变元组。
这是一个返回我需要的函数:
template <typename... Obs> std::tuple<Obs &...> BindObservers(Obs &... obs)
{
return std::tuple<Obs &...>(obs...);
}
它是这样称呼的:
auto obs2 = BindObservers(c1, c2, c3);
问题在于,要使用 BindObservers,我需要知道传递给它的参数数量,以及逗号之间的内容。我希望有一个像这样工作的 BindObservers:
auto obs2 = BindObservers(std::list<C>);
obs2 看起来像(伪代码):
std::tuple<C,C,more Cs here to the length of std::list<C>>(one parameter for each item in std::list<C> seperated by commas)
所以它是一种模板元编程。
我需要它来使用 c++11,因为我没有 c++14 编译器。
【问题讨论】:
-
你今天没有问过类似的问题吗?您收到的 cmets 仍然持有
-
cmets 不能在电脑上运行,还是说不可能?
-
Snark 也不获取答案。
list中的元素数量是否有界?在一般情况下,您所要求的是不可能的。这怎么不是你的last question的副本? -
在一般情况下是不可能的,因为在编译时必须知道要从此函数返回的
tuple(也决定了它的类型)中的元素数量,而list只能在运行时确定。如果列表大小是有界的(你现在说不是),说最大 N 个元素,然后创建一个函数,返回具有 N 个元素的tuple,如果list中的元素较少,则放置一些哨兵在空白处输入(标记可能是具有特殊值的C的实例)。 -
@Ivan C++ 不懂英文,你要求
std::tuple<C...>作为返回类型。您的函数必须为一组给定的参数类型返回 一个 类型。 您希望它返回哪种类型?这几乎没有意义,您最好回答“您真正想做什么?”的问题。
标签: c++ c++11 tuples variadic-templates template-meta-programming