【发布时间】:2013-10-10 14:22:27
【问题描述】:
是的。
假设我有一个包含 typedef 的简单可变参数结构:
template<typename... TArgs> struct TupleTypeHolder {
using TupleType = std::tuple<TArgs*...>;
};
我想将TupleTypeHolder<something> 作为模板参数传递给另一个类,并获取该类型定义。
我所有的尝试都没有编译。
// None of these is valid
template<template<typename...> class TTupleTypeHolder> struct TupleMaker {
using MyTupleType = TTupleTypeHolder::TupleType; // Not valid
using MyTupleType = typename TTupleTypeHolder::TupleType; // Not valid
};
template<template<typename... A> class TTupleTypeHolder> struct TupleMaker2 {
// A is not a valid name here
using MyTupleType = TTupleTypeHolder<A...>::TupleType; // Not valid
using MyTupleType = typename TTupleTypeHolder<A...>::TupleType; // Not valid
};
有没有办法从使用上述类作为模板可变参数模板参数的类中使用可变参数模板类的可变参数模板参数(在本例中为TupleTypeHolder 的TArgs...)?
使用示例:
template<typename... TArgs> struct TupleTypeHolder {
using TupleType = std::tuple<TArgs*...>;
};
template<typename... TArgs> static int getSomeValue() { ... }
template<??? T1, ??? T2> class TupleMaker
{
std::pair<int, int> someValues;
using TupleType1 = T1::TupleType;
using TupleType2 = T2::TupleType;
TupleMaker() : someValues{getSomeValue<T1's TArgs...>(),
getSomeValue<T2's TArgs...>()} { }
};
class MyTupleMaker : TupleMaker<TupleTypeHolder<int, char>,
TupleTypeHolder<int, float>>
{ };
MyTupleMaker::TupleType1 tuple1{new int(1), new char('a')};
MyTupleMaker::TupleType2 tuple1{new int(35), new float(12.f)};
【问题讨论】:
-
1)
TTupleTypeHolder是一个模板,而不是一个类型。 2)您无权访问A(您传递了一个没有参数的模板,因此没有要推断的参数)。 -
在您的代码中
A没有任何意义。它不是一个参数。这只是一个名字,没有任何意义。它更像是模板模板参数的签名的一部分。 -
请显示一个用法示例(
TupleMaker的预期用法示例)。 -
标题+1,如果没有别的(但也很有趣的问题)。
-
需要更多可变铃。
标签: c++ templates c++11 variadic-templates template-templates