【问题标题】:Variadic templates: One method per template argument可变参数模板:每个模板参数一个方法
【发布时间】:2021-02-11 06:51:14
【问题描述】:

有没有办法为每个可变参数模板参数自动创建一个方法?

例如,在下面的代码中,我想强制覆盖class i中的void x(a &v)void x(b &v)

#include <type_traits>
#include <stdlib.h>
#include <stdio.h>

class a {
};

class b {
};

template <typename ...T>
class t {
public:
    virtual void x(T &v) = 0;
};

class i : public t<a, b>
{
};

int
main (int argc, char *argv[])
{
    i ii;
    return 0;
}


【问题讨论】:

    标签: c++ variadic-templates member-functions


    【解决方案1】:

    您可以创建一个 t_impl 来保存单个 T 之类的虚函数

    template <typename T>
    class t_impl
    {
    public:
        virtual void x(T &v) = 0;
    };
    

    然后t 会像继承它一样

    template <typename ...T>
    class t : t_impl<T>... // can use public, protected or private inheritance
    {
    public:
        using t_impl<T>::x...; // used to import t_impl<T>::x into the public space
        // any additional common members
    };
    

    【讨论】:

    • 但要使x()t* 下可用,您应该添加using 声明。
    • 不错。这比我建议的(用于编译)更有效。我们还应该注意,用户不能两次列出相同的类型,或者我们需要在此处添加一些内容以防止在这种情况下进行第二次继承...
    • @Eugene 好电话。代码已修复。
    • @Elliott 是的。添加带有来自here 的检查的静态断言应该可以解决这个问题。
    【解决方案2】:

    不要将t 设为可变参数模板,只需将其模板化为单一类型即可:

    template <typename T>
    class t {
    public:
        virtual void x(T &v) = 0;
    };
    

    并像这样继承基类:

    class i : public t<a>, t<b>
    {
        virtual void x(a &v) {}
        virtual void x(b &v) {}
    };
    

    这是demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2019-11-22
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多