gpt4 book ai didi

c++ - 如何创建一个以另一个模板为模板的模板化类

转载 作者:行者123 更新时间:2023-11-28 06:40:47 24 4
gpt4 key购买 nike

问题定义:

我的问题与使用 typedef、map 和迭代器时的模板有关。

免责声明:

请接受我的歉意,我是 C++ 的新手,我的词汇量非常有限,因此我无法用语言准确描述我的问题。我附上了我的代码。我希望它能比他们解释得更多。

我的代码

我有两种类型的函数,set 和 get:

    template<class T>
struct SetFunctionClass
{
typedef boost::function<void(T)> SetFunction;
};

template<class G>
struct GetFunctionClass
{
typedef boost::function<G()> GetFunction;
};

我可以这样访问:

    void setX (int i)
{
std::cout<< "Ciao"<< i*2 << std::endl;
}

float getA()
{
return 0.1;
}
...
SetFunctionClass<int>::SetFunction fun = &setX;
GetFunctionClass<float>::GetFunction fun2 = &getA;
...

到这里为止一切都或多或少没问题,但我希望能够使用类似于以下的代码将此类函数插入到容器类中:

    FunctionHandler<SetFunctionClass<int>::SetFunction> myIntSetFunctionsHandler ;
FunctionHandler<GetFunctionClass<float>::GetFunction> myFloatGetFunctionsHandler ;

std::string methodName("setX");
myIntSetFunctionsHandler.insert(methodName, fun );
std::string methodName2("getA");
myFloatGetFunctionsHandler.insert(methodName2, fun2 );

这是我的容器类:

    template<template <typename > class FunctionClass>

class FunctionHandler
{
private:
typedef std::map<std::string, FunctionClass > Function_Map;
typedef typename std::map<std::string, FunctionClass >::iterator Function_Map_Iter;
Function_Map map;
public:
FunctionHandler(void);
virtual ~FunctionHandler(void);

void insert(std::string name, FunctionClass fun)
{
std::string funName(name);
map.insert(funName, fun);
}
FunctionClass find(const std::string& name)
{
std::auto_ptr<std::string> methodName(name);
Function_Map_Iter iter = map.find(*methodName.get());
if (iter == map.end())
throw std::runtime_error("Inexistent method: " + *methodName.get());
return iter->second;
}
};

我的问题:我的问题在于我对类 FunctionHandler 进行模板化的方式:

template<template <typename > class FunctionClass>

模板上的许多编译错误

还有这里的模板参数:注意:Eclipse 不接受这个签名

FunctionHandler<SetFunctionClass<int>::SetFunction> myIntSetFunctionsHandler;

问题:你能解释一下如何创建一个模板化类,它有另一个模板作为模板吗???

已编辑

谢谢!

最佳答案

您不需要模板模板参数,而是类型:

template<typename FunctionClass>
class FunctionHandler;

足够了。

然后你可以将它与

一起使用
FunctionHandler<SetFunctionClass<int>::SetFunction> myIntSetFunctionsHandler;
FunctionHandler<GetFunctionClass<float>::GetFunction> myFloatGetFunctionsHandler;

以下内容

template<template <typename > class FunctionClass> class Foo;

允许调用

Foo<SetFunctionClass> foo; // we don't mention what is the type of SetFunctionClass

关于c++ - 如何创建一个以另一个模板为模板的模板化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26019375/

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