让我们从一些代码开始。
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;
}
您可以创建一个特征来推断预期的类型:
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;
}
};