根据函数推导模板参数来重写基类

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

让我们从一些代码开始。

class intClass {
public:
    virtual ~intClass() = default;

    virtual int sum(int a, int b) const = 0;
};

class doubleClass {
public:
    virtual ~doubleClass() = default;

    virtual double sum(double a, double b) const = 0;
};

template<typename T, typename C>
class sumClass : public C {
public:
    T sum(T a, T b) const override {
        return a + b;
    }
};

int main() {
    sumClass<int, intClass> intSum;
    sumClass<double, doubleClass> doubleSum;
    return 0;
}

假设

intClass
doubleClass
按原样给出,并且无法更改。

我想从

T
中删除模板参数
sumClass
。 是否可以根据基类中
T
函数的签名推导
sum
? 我们最多可以使用 C++20。

总的来说,我希望我的

main
函数看起来像这样:

int main() {
    sumClass<intClass> intSum;
    sumClass<doubleClass> doubleSum;
    return 0;
}
c++ templates inheritance template-argument-deduction
1个回答
2
投票

您可以创建一个特征来推断预期的类型:

template <typename Sig>
struct sumTrait;

template <typename T, typename C>
struct sumTrait<T (C::*)(T, T) const>
{
    using type = T;
};

然后使用该特征:

template<typename C>
class sumClass : public C {
    using T = typename sumTrait<decltype(&C::sum)>::type;
public:
    T sum(T a, T b) const override {
        return a + b;
    }
};

演示

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