标签: variadic-templates

获取第N种可变参数模板模板?

如何获取第N种可变参数模板模板?例如

template<typename... Args>
class MyClass
{
    Args[0] mA; // This is wrong. How to get the type?

};
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates

30
推荐指数
2
解决办法
6690
查看次数

每个可变参数模板参数生成一个类成员

我有一个模板类,其中每个模板参数代表内部计算可以处理的一种类型的值.需要模板(而不是函数重载),因为值作为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成员中对我来说也不清楚.

谢谢你的帮助!

c++ template-meta-programming variadic-templates c++11

28
推荐指数
3
解决办法
1万
查看次数

可变构造函数是否应该隐藏隐式生成的构造函数?

可变构造函数是否应该隐藏隐式生成的构造函数,即默认构造函数和复制构造函数?

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++ templates copy-constructor variadic-templates c++11

27
推荐指数
1
解决办法
2618
查看次数

在c#中模拟可变参数模板

是否有一种众所周知的方法来模拟c#中的可变参数模板功能?

例如,我想编写一个带有任意参数集的lambda的方法.这是我想要的伪代码:

void MyMethod<T1,T2,...,TReturn>(Fun<T1,T2, ..., TReturn> f)
{

}
Run Code Online (Sandbox Code Playgroud)

谢谢

c# variadic-templates

27
推荐指数
4
解决办法
1万
查看次数

实现可变参数最小/最大功能

我正在实现可变的最小/最大函数.目标是利用编译时已知的参数数量并执行展开的评估(避免运行时循环).代码的当前状态如下(呈现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)

现在这可行,但我有一些问题/问题:

  1. 该 …

c++ templates variadic-templates c++11

27
推荐指数
4
解决办法
5332
查看次数

参数包必须位于参数列表的末尾...何时以及为何?

如果参数列表必须位于参数列表的末尾,如果后者绑定到类,则不会得到参数列表的原因,如果参数列表是成员方法声明的一部分,则放宽约束.

换句话说,这个编译:

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'必须位于模板参数列表的末尾

所以,我只是很好奇地完全理解为什么它在某些情况下被接受,但它不在其他一些情况下.

是一个类似的问题,但它只是解释了如何解决问题,这对我来说非常清楚.

c++ templates variadic-templates c++11

26
推荐指数
2
解决办法
3720
查看次数

如何在 C++ 中创建类型列表的笛卡尔积?

不言自明。

基本上,假设我有这样的类型列表:

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 是来自其他地方的决定:(

c++ templates variadic-templates c++17

26
推荐指数
3
解决办法
1123
查看次数

使用可变参数模板创建静态数组

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_使用任意数量的参数进行实例化,然后将这些参数在编译时复制到内部数组中.这是创建元函数以在编译时生成常量数组的有用方法.

但是,一个问题是它依赖于类模板参数来获取填充数组的实际值.这导致一个主要限制:只有积分常数可以用作值模板参数.因此,您无法使用此技术生成自定义类型的数组.

我试着想办法解决这个限制,但不能提出任何建议.有没有办法让这种技术适用于非积分常数?

c++ templates variadic-templates c++11

25
推荐指数
2
解决办法
1万
查看次数

C++ 11中的非类型可变参数函数模板

我看到一篇博客帖子使用了非类型的可变参数模板(目前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)

c++ variadic-templates c++11

25
推荐指数
3
解决办法
1万
查看次数

使用std :: ostream打印可变参数包的最简单方法是什么?

使用逗号分隔的参数包的最简单方法是什么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)

注意:可以假设<<操作员的相应过载可用于所有类型的参数包.

c++ templates variadic-templates c++11

25
推荐指数
4
解决办法
1万
查看次数