我想在模板实例之间共享一个函数,并想知道是否有办法做到这一点。
_____编辑以澄清问题_____
让我们看看下面的例子
#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.
答案 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。 这将有助于读者,它将增加获得有效回复的机会。