2012-01-07 243 views
2

我知道函数可以通过template参数,我可以像这样传递类构造函数。在C++中通过模板参数传递类构造函数

更新: 的全部原因,我想这样做,是我可以在存储库并没有任何代码我想的alloc类改变选择的构造函数(在这种情况下class A

class A 
{ 
public: 
    A(){n=0;} 
    explicit A(int i){n=i;} 

private: 
    int n; 
}; 

class MemoryPool 
{ 
public: 
    void* normalMalloc(size_t size); 
    template<class T,class Constructor> 
    T* classMalloc(); 
}; 

template<class T,class Constructor> 
T* MemoryPool::classMalloc() 
{ 
    T* p = (T*)normalMalloc(sizeof(T)); 
    new (p) Constructor; // choose constructor 
    return p; 
} 

MemoryPool pool; 
pool.classMalloc<A,A()>(); //get default class 
pool.classMalloc<A,A(1)>(); 
+0

'A()'的模板参数表示函数类型,不采取任何参数并返回'A'。 – Xeo 2012-01-07 13:11:25

+1

你能否提供一些更多的上下文?只给出这些小信息,我会问自己:为什么不直接使用'new A()'而不是'new_func ''?换句话说,'new_func'会给你买什么?它是否将建筑抽象掉? – Andre 2012-01-07 13:25:21

+0

@Andre原因是我想在内存池中使用它,我可以malloc一个类与选择工程 – xucheng 2012-01-08 04:41:28

回答

5

你无法绕过的构造函数,但是你可以通过工厂周边函子:

class A 
{ 
    int n; 

    A(int i) : n(i) {}; 

public: 

    static A* makeA(int i) 
    { 
     return new A(i); 
    } 
}; 

template<typename T, typename Factory> 
T* new_func(Factory factory) 
{ 
    return factory(); 
} 

#include <functional> 

int main() 
{ 
    new_func<A>(std::bind(&A::makeA, 0)); 
    new_func<A>(std::bind(&A::makeA, 1)); 
} 
+0

我想这样做的全部原因是我可以在内存池中选择构造函数,并且在我想要分配的类中没有任何代码改变 – xucheng 2012-01-08 05:00:25

4

你整个的假设是错误的。你不需要这个功能。

template<class T> 
T* new_func() 
{ 
    return new T; 
} 

new之后的东西是一个类型,而不是构造函数的引用。

+0

'new A()'和'new A(1) ' – xucheng 2012-01-07 13:21:30

+1

这不会“传递构造函数”。这将通过一个完整的参数列表。这甚至不适用于普通(成员)函数指针模板参数。当然,您必须将其作为普通函数参数而不是模板参数传递。阅读或询问“完美转发”。 – 2012-01-07 13:23:43

+1

将一个参数添加到'new_func()':'T * new_func(int i = 0)'并将其传递给构造函数。 – hmjd 2012-01-07 13:24:48

0

这样更好,我觉得

template<class T, int n> 
struct Factory 
{ 
    static T* new_func() 
    { 
    return new T(n); 
    } 
}; 

template<class T> 
struct Factory<T,0> 
{ 
    static T* new_func() 
    { 
    return new T; 
    } 
}; 

T* t = Factory<T>::new_func(); //call default constructor 
T* t2 = Factory<T,2>::new_func(); //call constructor T(2) 
+0

我想这样做的全部原因是我可以在内存池中选择构造函数并且在类中没有任何代码改变我想分配 – xucheng 2012-01-08 05:00:36

+0

您可以使用内存池类中的工厂风格。 – nttstar 2012-01-08 05:32:47

+0

每次使用它都很烦人吗?我必须写一个新的Factory结构体,因为malloc类构造函数的参数是未知的 – xucheng 2012-01-08 05:52:37

相关问题