Как передать пустые аргументы в шаблонах классов / функций - PullRequest
3 голосов
/ 27 июля 2011

Привет, я пытаюсь создать шаблонный класс 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 ]

5 голосов
/ 27 июля 2011

Вы можете указать спецификацию шаблона типа 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

0 голосов
/ 27 июля 2011

если я подписываюсь, вы хотите, чтобы у него было 0-2 аргумента для параметров?

, если вы хотите использовать c ++ 0x, тогда вы можете использовать шаблон с переменным числом аргументов.Это позволит вам использовать столько аргументов, сколько вам нужно.

...