如何获取第N种可变参数模板模板?例如
template<typename... Args>
class MyClass
{
Args[0] mA; // This is wrong. How to get the type?
};
Run Code Online (Sandbox Code Playgroud) 我有一个模板类,其中每个模板参数代表内部计算可以处理的一种类型的值.需要模板(而不是函数重载),因为值作为boost :: any传递,并且它们的类型在运行时之前不清楚.
为了正确地转换为正确的类型,我想为每个可变参数类型都有一个成员列表,如下所示:
template<typename ...AcceptedTypes> // e.g. MyClass<T1, T2>
class MyClass {
std::vector<T1> m_argumentsOfType1;
std::vector<T2> m_argumentsOfType2; // ...
};
Run Code Online (Sandbox Code Playgroud)
或者,我想将模板参数类型存储在列表中,以便用它做一些RTTI魔术(?).但是如何将它们保存在std :: initializer_list成员中对我来说也不清楚.
谢谢你的帮助!
可变构造函数是否应该隐藏隐式生成的构造函数,即默认构造函数和复制构造函数?
struct Foo
{
template<typename... Args> Foo(Args&&... x)
{
std::cout << "inside the variadic constructor\n";
}
};
int main()
{
Foo a;
Foo b(a);
}
Run Code Online (Sandbox Code Playgroud)
不知何故,我希望在阅读这个答案之后不打印任何内容,但它会inside the variadic constructor在g ++ 4.5.0上打印两次:(这种行为是否正确?
它也没有可变参数模板:
struct Foo
{
Foo()
{
std::cout << "inside the nullary constructor\n";
}
template<typename A> Foo(A&& x)
{
std::cout << "inside the unary constructor\n";
}
};
int main()
{
Foo a;
Foo b(a);
}
Run Code Online (Sandbox Code Playgroud)
同样,两行都打印出来.
是否有一种众所周知的方法来模拟c#中的可变参数模板功能?
例如,我想编写一个带有任意参数集的lambda的方法.这是我想要的伪代码:
void MyMethod<T1,T2,...,TReturn>(Fun<T1,T2, ..., TReturn> f)
{
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在实现可变的最小/最大函数.目标是利用编译时已知的参数数量并执行展开的评估(避免运行时循环).代码的当前状态如下(呈现min - max类似)
#include <iostream>
using namespace std;
template<typename T>
T vmin(T val1, T val2)
{
return val1 < val2 ? val1 : val2;
}
template<typename T, typename... Ts>
T vmin(T val1, T val2, Ts&&... vs)
{
return val1 < val2 ?
vmin(val1, std::forward<Ts>(vs)...) :
vmin(val2, std::forward<Ts>(vs)...);
}
int main()
{
cout << vmin(3, 2, 1, 2, 5) << endl;
cout << vmin(3., 1.2, 1.3, 2., 5.2) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在这可行,但我有一些问题/问题:
该 …
如果参数列表必须位于参数列表的末尾,如果后者绑定到类,则不会得到参数列表的原因,如果参数列表是成员方法声明的一部分,则放宽约束.
换句话说,这个编译:
class C {
template<typename T, typename... Args, typename S>
void fn() { }
};
Run Code Online (Sandbox Code Playgroud)
以下不是:
template<typename T, typename... Args, typename S>
class C { };
Run Code Online (Sandbox Code Playgroud)
为什么第一种情况是正确的,第二种情况不是?
我的意思是,如果它是合法的语法,那么在这两种情况下都不应该这样吗?
要清楚,真正的问题是我正在定义一个类似于下面的类:
template<typename T, typename... Args, typename Allocator>
class C { };
Run Code Online (Sandbox Code Playgroud)
将分配器类型作为最后一种类型将不胜感激,但我可以以某种方式解决它(无论如何,如果你有一个建议,它的赞赏,也许你的优雅比我的更优雅!).
那就是说,我收到了错误:
参数包'Args'必须位于模板参数列表的末尾
所以,我只是很好奇地完全理解为什么它在某些情况下被接受,但它不在其他一些情况下.
这是一个类似的问题,但它只是解释了如何解决问题,这对我来说非常清楚.
不言自明。
基本上,假设我有这样的类型列表:
using type_list_1 = type_list<int, somestructA>;
using type_list_2 = type_list<somestructB>;
using type_list_3 = type_list<double, short>;
Run Code Online (Sandbox Code Playgroud)
它们可以是可变数量的类型列表。
如何获得笛卡尔积的类型列表?
result = type_list<
type_list<int, somestructB, double>,
type_list<int, somestructB, short>,
type_list<somestructA, somestructB, double>,
type_list<somestructA, somestructB, short>
>;
Run Code Online (Sandbox Code Playgroud)
我确实涉足了如何创建这里给出的双向笛卡尔积:如何创建类型列表的笛卡尔积?,但 n 方式似乎没有那么微不足道。
目前我正在尝试...
using type_list_1 = type_list<int, somestructA>;
using type_list_2 = type_list<somestructB>;
using type_list_3 = type_list<double, short>;
Run Code Online (Sandbox Code Playgroud)
我只想说,考虑到正确处理的难度,只需使用巴里的答案中的 boost 即可。不幸的是,我不得不坚持使用手动方法,因为是否使用 boost 是来自其他地方的决定:(
stackoverflow上有一个答案(我似乎无法再找到它),它演示了如何在C++ 11中使用可变参数模板在编译时创建静态数组:
template <class T, T... args>
struct array_
{
static const T data[sizeof...(args)];
};
template <class T, T... args>
const T array_<T, args...>::data[sizeof...(args)] = { args... };
Run Code Online (Sandbox Code Playgroud)
可以提供递归元函数以array_使用任意数量的参数进行实例化,然后将这些参数在编译时复制到内部数组中.这是创建元函数以在编译时生成常量数组的有用方法.
但是,一个问题是它依赖于类模板参数来获取填充数组的实际值.这导致一个主要限制:只有积分常数可以用作值模板参数.因此,您无法使用此技术生成自定义类型的数组.
我试着想办法解决这个限制,但不能提出任何建议.有没有办法让这种技术适用于非积分常数?
我看到一篇博客帖子使用了非类型的可变参数模板(目前gcc不支持,只有clang支持).
template <class T, size_t... Dimensions>
struct MultiDimArray { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
帖子中的示例编译得很好,但我没能使用函数模板.
任何人都可以帮助找出正确的语法(如果存在)?
int max(int n) { return n; } // end condition
template <int... N> // replacing int... with typename... works
int max(int n, N... rest) // !! error: unknown type name 'N'
{
int tmp = max(rest...);
return n < tmp? tmp : n;
}
#include <iostream>
int main()
{
std::cout << max(3, 1, 4, 2, 5, 0) << std::endl;
}
Run Code Online (Sandbox Code Playgroud) 使用逗号分隔的参数包的最简单方法是什么std::ostream?
例:
template<typename... Args>
void doPrint(std::ostream& out, Args... args){
out << args...; // WRONG! What to write here?
}
// Usage:
int main(){
doPrint(std::cout,34,"bla",15); // Should print: 34,bla,15
}
Run Code Online (Sandbox Code Playgroud)
注意:可以假设<<操作员的相应过载可用于所有类型的参数包.