【发布时间】:2020-06-03 01:17:35
【问题描述】:
在我现有的代码库中,我有一个非模板类,它的构造函数具有以下声明签名...
struct SomeStruct {
double a_;
double b_;
SomeStruct(double a, double b) : a_{a}, b_{b} {}
}
class SomeClass {
private:
SomeStruct fields_;
size_t n_;
std::function<double(double)> func_;
public:
SomeClass(SomeStruct fields, size_t n, std::function<double(double)> func) :
fields_{fields}, n_{n}, func_{func}
{}
};
我是这样使用它的:
constexpr double funcA(double x) {
return x;
}
constexpr double funcB(double x) {
return x*x;
}
int main() {
SomeClass a(SomeStruct{1.0, 5.0}, 1000, &funcA);
SomeClass b(SomeStruct{3.5, 7.7}, 2000, &funcB);
return 0;
}
上面的表示效果很好......
我正在重构我的代码,我想对我的类进行模板化,我正在尝试允许将类及其成员函数完全定义为 constexpr...
我的类的新签名应该是这样的:
template<typename Field>
struct SomeStruct {
Field a_;
Field b_;
constexpr SomeStruct(Field a, Field b) : a_{a}, b_{b} {}
};
template<typename FieldType, typename ValueType, typename Func>
class SomeClass {
SomeStruct<FieldType> fields_;
size_t n_;
// std::function<double(double)> func_; // No longer using `std::function` since I want this to be constexpr
Func* func_; // would like to save a pointer to a function, functor, function object, or lambda instead...
public:
SomeClass(SomeStruct<FieldType> fields, size_t n, Func* func) :
fields_{fields}, n_{n}, func_{func}
{}
};
我在这里遇到或正在努力解决两个问题或问题......
ValueType 模板参数应该是Func 模板参数的一部分...作为旁注,所有函数指针、函子、lambda 等目前都具有接受单个参数的形式T 类型的值,它们返回 T 类型的值。
另一个“更重要”的问题涉及我尝试实例化对象时...
SomeClass<double, double, ?> a{ SomeStruct{ 3.0, 5.0 }, 1000, &funcA };
我对函数指针的模板参数的语法感到困惑......以及能够将函数作为对象传递......
【问题讨论】:
标签: c++ templates parameters c++17 constexpr