2015-11-18 181 views
1

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

_____编辑澄清问题_____

让我们看看下面的例子

#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 & a K作为参数的函数,并检查t他指出,从而将可执行文件的大小保存在多个副本上,例如一个用于K = 2 &另一个用于K = 3。

回答

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。 这将有助于读者,它会增加获得有效回复的机会。