gpt4 book ai didi

c++ - 具有成员函数模板的类模板,其模板参数不是函数参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:40:44 24 4
gpt4 key购买 nike

我正在实现代码来交换 TCP 消息,我在 this stackoverflow posting 中遇到了一种有趣的消息构造方法。 .它使用工厂模式,其中要创建的对象的类型已向工厂注册。注册函数是一个成员模板,其模板参数是要创建的对象的类型,而不是函数本身的参数(它是一个相应的整数标识符)。

/**
* A class for creating objects, with the type of object created based on a key
*
* @param K the key
* @param T the super class that all created classes derive from
*/
template<typename K, typename T>
class Factory {
private:
typedef T *(*CreateObjectFunc)();
/**
* A map keys (K) to functions (CreateObjectFunc)
* When creating a new type, we simply call the function with the required key
*/
std::map<K, CreateObjectFunc> mObjectCreator;

/**
* Pointers to this function are inserted into the map and called when creating objects
*
* @param S the type of class to create
* @return a object with the type of S
*/
template<typename S>
static T* createObject(){
return new S();
}

//skip a bunch of code...
public:
/**
* Registers a class to that it can be created via createObject()
*
* @param S the class to register, this must ve a subclass of T
* @param id the id to associate with the class. This ID must be unique
*/
template<typename S>
void registerClass(K id){
if (mObjectCreator.find(id) != mObjectCreator.end()){
//your error handling here
}
/*Note: I removed the explicit template parameters from the
*call to std::make_pair() in the original code referenced in
*text above since it caused complilation errors. */
mObjectCreator.insert( std::make_pair(id, &createObject<S> ) );
}
}

我看不到要创建的类型 () 是如何注册的,因为它的类型不是注册函数的参数,因此无法从这些参数中推导出来。这是代码中的问题还是我需要以某种方式声明该函数?

最佳答案

@IgorTandetnik 在评论中提供了我自己的问题的答案。

解决方案是简单地将模板参数传递给模板函数,方法是使用模板函数名称和括号化参数之间的普通括号,如下所示:

factory.registerClass<MyClass>(myId);

关于c++ - 具有成员函数模板的类模板,其模板参数不是函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51232994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com