在C++中是否可以模板化一个参数数量未知的方法,并在重写定义中指定参数的数量?

问题描述 投票:0回答:1

我有两个类(BaseClass、DerrivedClass),我想在 BaseClass 中创建一个具有未定义数量的参数的虚拟方法。参数的数量(如果有)应在方法的 DerrivedClasses 重写中定义。 BaseClass 定义可以是抽象的,也可以不是,但最好是抽象的。我想要这个的原因是这样我可以强制 BaseClass 的每个子类用它自己的唯一值覆盖定义。

这可能吗,还是只是一厢情愿?

class BaseClass
{
    public:
        // I want to be able to override this method with as many parameters as the DerrivedClass desires, without having to make a version of it in BaseClass.
        virtual AssignValues() = 0;
}

class DerrivedClass : public BaseClass
{
    public:
        void AssignValues(const std::string& value1, const int value2) override
        {
            m_value1 = value1;
            m_value2 = value2;
        };
    private:
        std::string m_value1;
        int m_value2;
}

class DerrivedClass2 : public BaseClass
{
    public:
        void AssignValues(const int value) override
        {
            m_value = value;
        };
    private:
        int m_value;
}

主.cpp

DerrivedClass example1;
DerrivedClass2 example2;

example1.AssignValues("Test Name", 1);
example2.AssignValues(2);
c++ class methods parameters
1个回答
0
投票

您想要实现的目标对我来说似乎是一个设计缺陷,但如果确实需要这样做,您可以获得的最接近的是具有单个多态参数的虚拟成员函数,该函数能够携带所有需要的信息。 在我的第一个示例中,我使用了 std::variant,因此需要预先了解类型。

#include<iostream>
#include <variant>


struct Vals
{
    int x{};
    char y{};
};

using SetterArgs = std::variant<Vals, double>;

struct Base
{
    virtual void setValues(const SetterArgs&) = 0;
    virtual ~Base() = default;
};


struct Der1 : Base
{
    int val1;
    char val2;

    void setValues(const SetterArgs& a) override
    {
        const auto& v = std::get<Vals>(a);
        val1 = v.x;
        val2 = v.y;
    }
};

struct Der2 : Base
{
    double val;

    void setValues(const SetterArgs& a) override
    {
        const auto& v = std::get<double>(a);
        val = v;
    }
};

int main()
{
    Der1 d1;
    static_cast<Base&>(d1).setValues(Vals{82, 'z'});
    std::cout << d1.val1 << ' ' << d1.val2 << '\n';

    Der2 d2;
    static_cast<Base&>(d2).setValues(3.14);
    std::cout << d2.val << '\n';
}

https://godbolt.org/z/eM9eYd8e3

std::any
也可以在这里工作

#include <any>


struct Vals
{
    int x{};
    char y{};
};

struct Base
{
    virtual void setValues(const std::any&) = 0;
    virtual ~Base() = default;
};


struct Der1 : Base
{
    int val1;
    char val2;

    void setValues(const std::any& a) override
    {
        const auto& v = std::any_cast<Vals>(a);
        val1 = v.x;
        val2 = v.y;
    }
};

struct Der2 : Base
{
    double val;

    void setValues(const std::any& a) override
    {
        const auto& v = std::any_cast<double>(a);
        val = v;
    }
};

https://godbolt.org/z/cGWY4h3qY

© www.soinside.com 2019 - 2024. All rights reserved.