如何创建一个模板化的类,其中包含另一个模板作为模板

时间:2014-09-24 14:23:54

标签: c++ templates

问题定义:

使用typedef,map和iterator时,我的问题与模板模板有关。

免责声明:

请接受我的道歉,我是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;

问题: 能否请您解释一下如何创建一个模板化的类,其中包含另一个模板的模板???

EDITED

感谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

SetFunctionClass<int>是一种类型,SetFunctionClass<int>::SetFunction也是。 SetFunctionClasstemplate

template <typename > class FunctionClass是模板参数,而不是类型参数。

template是在填写参数时产生类型的东西。它们不是类型。传递它们时,它们不能在template中用作类型,它们只能用作template

如果你想要一个类型,传入一个类型,并接受一个类型。