我有以下问题:
#include <vector>
#include <tuple>
using namespace std;
template< size_t... N_i, typename Ts... >
class A
{
// ...
private:
std::vector<size_t> _v = { N_i... };
std::tuple<Ts...> _t;
};
int main()
{
A<1> a;
}
如上所示,我尝试将多个参数包定义为类A
的模板参数
不幸的是,代码无法编译:
错误:在&#39; Ts&#39;
之前预期的嵌套名称说明符
如何为此示例定义多个参数包?
答案 0 :(得分:8)
实现最终目标的一种方法是使用嵌套模板:
template< size_t... N_i> class initial_values {
public:
template <typename Ts...>
class A
{
// ...
private:
std::vector<size_t> _v = { N_i... };
std::tuple<Ts...> _t;
};
};
然后可以引用模板,例如:
initial_values<1,2,3>::A<int, char> a;
答案 1 :(得分:2)
考虑错误:
在'Ts'
之前预期的嵌套名称说明符
这是因为你写了:
template< size_t... N_i, typename Ts... >
而不是:
template< size_t... N_i, typename... Ts >
也就是说,即使您修复它,代码也无法编译 这是因为你不能像你那样混合两个参数包 您必须重构代码,以便能够以某种方式从上下文中推断出它们。
例如,您可以使用std::index_sequence
和部分专业化,如下所示:
#include <vector>
#include <tuple>
#include<functional>
using namespace std;
template< typename... >
class A;
template< size_t... N_i, typename... Ts >
class A<index_sequence<N_i...>, Ts...>
{
// ...
private:
std::vector<size_t> _v = { N_i... };
std::tuple<Ts...> _t;
};
int main()
{
A<index_sequence<1>> a;
}