abr*_*ert 6 c++ templates variadic-templates c++14
我有以下问题:
#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;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我尝试将多个参数包定义为类的模板参数A.
不幸的是,代码无法编译:
错误:'Ts'之前的预期嵌套名称说明符
如何为此示例定义多个参数包?
实现最终目标的一种方法是使用嵌套模板:
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;
};
};
Run Code Online (Sandbox Code Playgroud)
然后可以引用模板,例如:
initial_values<1,2,3>::A<int, char> a;
Run Code Online (Sandbox Code Playgroud)
考虑一下错误:
'Ts' 之前应有嵌套名称说明符
这是因为您写道:
template< size_t... N_i, typename Ts... >
Run Code Online (Sandbox Code Playgroud)
代替:
template< size_t... N_i, typename... Ts >
Run Code Online (Sandbox Code Playgroud)
也就是说,即使你修复了它,代码也无法编译。
这是因为您无法像以前那样混合两个参数包。
您必须重构您的代码,以便可以以某种方式从上下文中推断出它们。
例如,您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)