Вы можете использовать SwiftValidator , это валидатор на основе правил.
let validator = Validator()
//Register the fields that you want to validate
validator.registerField(fullNameTextField, rules: [RequiredRule(), FullNameRule()])
@IBAction func signupTapped(sender: AnyObject) {
validator.validate(self)
}
Существуют способы сохранить функции, проблема, чтобы смочь вызвать функцию с желаемым аргументом, необходимо было бы знать подпись вызова функции так или иначе, и если у Вас есть та информация, Вы могли бы также использовать отдельные карты или использовать более сложный объект, чем повышение:: функция.
Если Вы готовы сделать немного работы и иметь конечное число подписей, Вы могли просто сделать что-то вроде этого:
class MultiFunc
{
protected:
MultiFunc() {}
public:
typedef void (*stringFunc)(const std::string&);
typedef void (*intFunc)(int);
static MultiFunc *Create(stringFunc function);
static MultiFunc *Create(intFunc function);
virtual void operator()(const string &) { throw exception(); }
virtual void operator()(int) { throw exception(); }
virtual ~MultiFunc();
};
class MultiFuncString : public MultiFunc
{
private:
stringFunc Function;
public:
MultiFuncString(stringFunc function) : Function(function) {}
virtual void operator()(const string &arg) { Function(arg); }
};
class MultiFuncInt : public MultiFunc
{
private:
intFunc Function;
public:
MultiFuncInt(intFunc function) : Function(function) {}
virtual void operator()(int arg) { Function(arg); }
};
MultiFunc *MultiFunc::Create(MultiFunc::stringFunc function)
{
return new MultiFuncString(function);
}
MultiFunc *MultiFunc::Create(MultiFunc::intFunc function)
{
return new MultiFuncInt(function);
}
void func1(const std::string& s)
{
std::cout << s << std::endl;
}
void func2(int me)
{
std::cout << me << std::endl;
}
int main()
{
map<string, MultiFunc *> a_map;
a_map["func1"] = MultiFunc::Create(&func1);
(*a_map["func1"])("Hello");
a_map["func2"] = MultiFunc::Create(&func2);
(*a_map["func2"])(3);
// Remember to delete the MultiFunc object, or use smart pointers.
}
Это производит:
Hello 3
К сожалению, Вы не можете сделать шаблонные виртуальные функции, или Вы легко обобщаете это все.
считайте эту ссылку ниже. Это говорит об использовании повышения:: свяжите для хранения указателей функции в станд.:: карта
http://www.gamedev.net/community/forums/topic.asp?topic_id=526381&whichpage=1�
Вы, вероятно, не можете использовать std::map
так как это - однородный контейнер. Попробуйте, что-то как boost::variant
(они поддерживают шаблон "посетитель"), или boost::tuple
То, что Вы пытаетесь сделать, звучит немного странным. Обычно, у Вас был бы контейнер быть набором абстрактных типов или объектов или функций с той же подписью. Иначе, как Вы знали бы, как вызвать функцию при итерации контейнера? Мне нравится делать контейнер набором функциональных объектов с известной подписью, затем использовать Повышение. Свяжите для хранения закрытий, которые вызывают функцию с дополнительными аргументами.
Например:
typedef boost::function<void, void> Function;
typedef std::map<std::string, Function> Functions;
Functions functions:
void foo()
{
...
}
functions["foo"] = foo;
void bar(std::string &s)
{
...
}
// binds the value "hello" to the s parameter
functions["bar"] = boost::bind(bar, "hello");
Нет. Вы не можете. Начиная с повышения:: функция не является полиморфной, она повреждается там. (Это берет фиксированный набор типов аргумента.)
Был разговор о работе в том направлении в почтовом списке повышения, тем не менее, так ищите архивы и посмотрите, существует ли некоторый код, Вы могли youse.
Обходное решение должно было бы использовать повышение:: функционируйте, но затем необходимо добавить к карте не реальные функции (т.е. func1/func2), но функции отправки, который извлекает тип из любого - контейнер и вызывает реальную функцию. (И залоги, если это неправильно, так же, как в каком-либо динамическом langugage.)
интерфейсы хранилища:
struct IStringData
{
virtual std::string get() const = 0;
virtual ~IStringData() {}
};
и сделайте implementaions, каждый будет просто содержать строковое значение, другая реализация сохранит функтор, возможно, у Вас будут другие реализации в будущем.