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