Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内联函数作为模板参数,不使用函数指针_C++_Templates_Inline - Fatal编程技术网

C++ 内联函数作为模板参数,不使用函数指针

C++ 内联函数作为模板参数,不使用函数指针,c++,templates,inline,C++,Templates,Inline,我正在开发一个对象Foo,它有几个成员变量和一个主要成员函数bar() 模板 福 { 公众: T bar() { ... 返回m_a+myfunction(m_b); } 私人: T m_a,m_b; }; 目前myfunction是另一个成员函数。但我希望能够写出这样一部主要作品: float newfunction(float) {....} void main() { Foo<float, newfunction> foo; float result = f

我正在开发一个对象Foo,它有几个成员变量和一个主要成员函数bar()

模板
福
{
公众:
T bar()
{
...
返回m_a+myfunction(m_b);
}
私人:
T m_a,m_b;
};
目前myfunction是另一个成员函数。但我希望能够写出这样一部主要作品:

float newfunction(float) {....}

void main()
{
    Foo<float, newfunction> foo;
    float result = foo.bar();
}
float newfunction(float){….}
void main()
{
富富,;
浮点结果=foo.bar();
}

因此,newfunction将在bar()中内联使用,而不是myfunction。我不想为了性能目的而使用函数指针:bar()使用openMP,myfunction()被设计为每秒被cpu的每个核心调用数千次。所以我认为在这种情况下,我的函数必须是内联的,不能使用指针。而newfunction是一个简单的函数,计算成本非常低。

如果您只在
Foo::bar
函数中使用
newfunction
,那么我建议您将其作为参数传递给
bar
函数:

template<typename T>
struct Foo
{
    template<typename F>
    T bar(F func)
    {
        return m_a + func(m_b);
    }

    T m_a, m_b;
};
用作

Foo<float> foo(newfunction);
float result = foo.bar();
Foo-Foo(newfunction);
浮点结果=foo.bar();

请在对性能做出假设之前进行测量。我真的怀疑调用函数指针是否是任何代码中的瓶颈。事实上,bar()使用openMP和myfunction()被设计为每秒被cpu的每个核心调用数千次。所以我认为在这种情况下,我的函数必须是内联的,我不能使用指针,但你应该测量它。你的函数可能做了很多事情,与函数的开销相比,调用指针的开销非常低。不,myfunction是一个非常简单的函数,例如它可能只是一个求和或乘积。谢谢,但我正在寻找编译时固定的函数。我不想使用指针。@Nodera为什么?你想解决的实际问题是什么?您想要
constexpr
函数吗?因为否则,函数调用无论如何都会在运行时发生,即使是“内联的”。也许您应该花一些时间阅读,并思考如何改进您的问题,以告诉我们您希望使用此特定解决方案解决的实际问题。
Foo<float> foo;
float result = foo(newfunction);
template<typename T>
struct Foo
{
    Foo(std::function<T(T)>& func)
        : m_function(func)
    {}

    T bar()
    {
        return m_a + m_function(m_b);
    }

    T m_a, m_b;
    std::function<T(T)> m_function;
};
Foo<float> foo(newfunction);
float result = foo.bar();