跨模板实例共享功能

时间:2015-11-18 12:33:05

标签: c++ templates

我想在模板实例之间共享一个函数,并想知道是否有办法做到这一点。

_____编辑以澄清问题_____

让我们看看下面的例子

#include <array>

template <unsigned int K>
class kd_tree
{
public:

    using kd_point = std::array<float, K>;

    bool isValid(const kd_point &kdPoint) const
    {
        for (unsigned i = 0; i < K; i++)
            if ( isnan(kdPoint[i]) ||
                 kdPoint[i] == numeric_limits<float>::infinity() ||
                 kdPoint[i] == -numeric_limits<float>::infinity() )
                return false;

        return true;
    }
};

对于K的每个值,将创建一个新的isValid值,除了具体的K值之外什么都不相同。当然不需要K来使用kd_point的运算符[]

问题是是否有办法将isValid从类中取出并使其成为接受kd_point&amp;的函数。将K作为参数,并检查该点,从而在其多个副本上保存可执行文件大小,例如一个用于K = 2&amp;另一个是K = 3.

1 个答案:

答案 0 :(得分:0)

我不确定我是否已经理解了这个问题,但是像以下那样的工厂能解决这个问题吗?

void fn() { }

template<void(*Function)()>
class C {
    C() = default;

public:
    static C<Function>* create() {
        return new C<Function>{};
    }
};

using CfnFactory = C<fn>;

int main() {
    C<fn> *c = CfnFactory::create();
}

请注意,上面的示例也适用于成员函数,它只是一个可能的解决方案的最小示例(当然,如果我遇到问题)。

我们的想法是在工厂中注入用于创建类型实例的函数,以便所有函数都依赖于相同的函数。这样你也可以根据不同的函数创建多个工厂,并将返回的对象混合在一起(最后一点需要一个基本的非模板类,但这很容易做到。)

无论如何,我强烈建议您将示例中的代码量减少到mvce。 这将有助于读者,它将增加获得有效回复的机会。