如何在类/函数模板中传递void参数

时间:2011-07-27 00:29:04

标签: c++ class templates membership void

嘿我正在尝试创建一个Button模板类,它是按下按钮时按下的 构建的(例如鼠标位置),以及指向应调用的函数的指针。

然而按钮经常返回void并且不带参数(你按下的按钮会发生一些事情:它们不接受任何参数,它们被按下然后只是做某事。)所以我将如何生成类成员函数,因为显然我不能将 void 作为参数类型?

以下是有用的来源:

    template<typename Return = void, typename Arg1 = void, typename Arg2 = void> 
class Button 
{
private:
    boost::function<Return (Arg1, Arg2)> Function;
    //Return (*Function)(Arg1, Arg2);              // this didn't work so i tried boost::function

public:
    void Activate(Arg1, Arg2){ Function(Arg1, Arg2) ;};

    void SetFunction(Return (*Function)(Arg1, Arg2)){
        this->Function= Function;};

    //constructors
    Button(){ Function= 0;};

    Button( Return (*Function)(Arg1, Arg2)){  
        this->Function = &Function; };
};

2 个答案:

答案 0 :(得分:5)

您可以指定void类型的模板规范,例如,您可以使用模板化类button的以下变体:

template <typename rtnVal, typename Val1, typename Val2>
class Button {
private:
    rtnVal(*Function)( Val1 val1, Val2 val2 );

public:
    Button() : Function( nullptr ) {}

    void SetFunction( rtnVal(*func)(Val1, Val2) ) {
        Function = func;
    }

    rtnVal RunFunction( Val1 val1, Val2 val2 ) { return Function( val1, val2 ); }
};

// Special void type, accepting arguments overload:
template < typename Val1, typename Val2 >
class Button< void, Val1, Val2 > {
private:
    void(*Function)(Val1 val1, Val2 val2);

public:
    Button() : Function( nullptr ) {}

    void SetFunction( void(*func)(Val1, Val2) ) {
        Function = func;
    }

    void RunFunction( Val1 val1, Val2 val2 ) { return Function( val1, val2 ); }

};

// Pure void type:
template<>
class Button<void, void, void> {
private:
    void(*Function)( void );

public:
    Button() : Function( nullptr ) {}

    void SetFunction( void(*func)() ) {
        Function = func;
    }

    void RunFunction() { 
        return Function();
    }
};

这允许你初始化并使用void作为参数,例如,给定一个void函数Print(),以下内容现在有效:

void Print()
{
    std::cout << "Function has been called" << std::endl;
}

int main()
{
    Button< void, void, void > btn;

    btn.SetFunction( Print );

    btn.RunFunction();

    std::cout << "Finished";
}

我希望这有助于清理事情! :)

注意:nullptr是C ++ 0x关键字,如果您的编译器没有实现它,请使用#define nullptr 0

答案 1 :(得分:0)

如果我关注你想拥有它,那么用户可以拥有0-2 args for params?

如果您愿意使用c ++ 0x,那么您可以使用可变参数模板。这将允许您根据需要使用尽可能多的args。