【发布时间】:2018-02-26 06:41:04
【问题描述】:
我想在类中存储一个函数或对它的引用作为成员变量。我知道存储函数指针以及 std::function 或 boosts 等价物。但是,我最近read 表示,与模板参数相比,使用指针会导致调用开销。在那次搜索中,我偶然发现了this 帖子,但我无法从答案中重现工作代码。以下是我尝试过的一些答案:
template<typename ftype>
class MyClass
{
private:
ftype func;
public:
MyClass(ftype func_)
:func(func_)
{}
};
double dosth(double x)
{
return x*x;
}
int main()
{
MyClass<decltype(dosth)> entity(dosth);
}
但是,它会导致错误:
错误:使用函数类型“双(双)”实例化的数据成员
注意:在此处请求的模板类 'MyClass' 的实例化中
我不确定确切的问题出在哪里,但我希望在编译时输入确切的函数类型。
所以我的问题是:编写一个以某种方式需要将重复调用(并且仅调用)的函数信息的类,我能做些什么来避免上述开销?
【问题讨论】:
-
您问的是开销还是要编译的代码?
-
@juanchopanza 我在询问规避上述开销的方法,并且只显示了我使用该代码尝试过(但失败了)的方法。我在想这个与链接问题有关的方向可能是正确的,也许我只是犯了一个愚蠢的错误,可以很容易地解决这个问题。
-
你有真正的性能问题,还是只是过早优化?
-
要修复编译器错误,您可以使用
ftype* func;或MyClass<decltype(&dosth)> entity(dosth);。至于关于开销的问题。我认为您需要将func声明为内联和/或将其设为std::function。 -
您的编译器错误与开销无关。最好就一件事提出一个明确的问题。