迭代可变参数模板中的类型

吐消费者

我有一个使用可变参数模板模板化的成员函数。成员函数想要将一些关于可变参数模板中类型的信息推送到容器的某个位置,例如typeid(T)sizeof(T)

成员函数还应该接受可变数量的参数,每个参数的类型都是可变参数模板中指定的类型。任何未显式定义的参数都应默认为该类型的默认构造。

基本上是这样,但是 bar 在某种程度上是一个可变参数模板,并且该代码对于可变参数模板中的所有类型都重复。

class foo {
private:
    std::unordered_map<std::type_index, std::size_t> typeinfo;

public:
    template<typename T>
    void bar(T myType = T()) {
        typeinfo.insert({ typeid(T), sizeof(T) });
        
        // do stuff with myType ...
    }
};

foo myfoo;
myfoo.bar<int, double>(); // myType<int> = 0, myType<double> = 0.0;
myfoo.bar<char, float>('a'); // myType<char> = 'a', myType<float> = 0.0f;
myfoo.bar<double, char>(32.4, 'b'); // myType<double> = 32.4, myType<char> = 'b'
贾罗德42

参数包不能有默认参数

所以

template<typename... Ts>
void bar(Ts... = Ts()...) // ill-formed

您可以做的是使用 2 个参数包

class foo {
private:
    std::unordered_map<std::type_index, std::size_t> typeinfo;

public:
    // Us... is non deducible
    template<typename... Us, typename... Ts>
    void bar(Ts... /*args*/) {
        (typeinfo.insert({ typeid(Us), sizeof(Us) }), ...);
        // You might have to check that Ts... start Us...
        // use end of Us... for args...
    }
};

void test()
{
    foo myfoo;
    myfoo.bar<int, double>(); // Us=[int, double], Ts=[]
    myfoo.bar<char, float>('a'); // Us =[char, float], Ts = [char];
    myfoo.bar<double, char>(32.4, 'b'); // Us=[double, char], Ts=[double, int]
    myfoo.bar<char>(4.2f); // Us =[char], Ts = [float] !!!
}

演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

迭代可变参数模板类型

可变参数模板中的求和类型

如何迭代可变参数模板类型(不是参数)?

在没有参数的可变参数模板中迭代

非类型可变参数模板参数

可变参数模板继承中的类型不匹配

如何检查可变参数模板中的非原始类型?

配对从可变参数模板中随机获得的兼容类型

计算可变参数模板元组中的 std::optional 类型

缺省类型的可变参数模板

可变参数模板类型推导

动态值的可变参数模板类型

从结构中获取所有可变参数模板类型,该结构是函数模板中的类型参数

在C ++中使用可变参数模板迭代参数包

可变参数模板:遍历类型/模板参数

可变参数模板对

可变参数模板参数中的混合类型和非类型?

可变参数模板中的函数顺序

在C ++中可变参数模板中是否有对函数参数实施类型限制的好方法?

在模板化类的可变参数模板中包装每种类型

如何检查类型是否从模板函数中的某个可变参数模板类实例化?

C ++可变参数模板迭代向量并比较元素

将递归可变参数模板函数转换为迭代

无法推断可变参数模板的模板类型

在可变参数模板列表中插入/删除类型(参数包)

检查是否在可变参数模板参数包中传递类型

可变参数模板类,从其参数列表中获取特定类型的索引

可变参数模板将类型参数解压缩

可变参数模板函数参数和引用类型推导