代码之家  ›  专栏  ›  技术社区  ›  qtuser

基于重写基类的函数推导模板参数

  •  0
  • qtuser  · 技术社区  · 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;
    }
    
    1 回复  |  直到 1 周前
        1
  •  2
  •   Jarod42    1 周前

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

    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;
        }
    };
    

    Demo