Карта функции повышения различных типов?

Вы можете использовать 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)
}

7
задан UberJumper 14 March 2009 в 21:10
поделиться

6 ответов

Существуют способы сохранить функции, проблема, чтобы смочь вызвать функцию с желаемым аргументом, необходимо было бы знать подпись вызова функции так или иначе, и если у Вас есть та информация, Вы могли бы также использовать отдельные карты или использовать более сложный объект, чем повышение:: функция.

Если Вы готовы сделать немного работы и иметь конечное число подписей, Вы могли просто сделать что-то вроде этого:

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

К сожалению, Вы не можете сделать шаблонные виртуальные функции, или Вы легко обобщаете это все.

2
ответ дан 7 December 2019 в 10:08
поделиться

считайте эту ссылку ниже. Это говорит об использовании повышения:: свяжите для хранения указателей функции в станд.:: карта

http://www.gamedev.net/community/forums/topic.asp?topic_id=526381&whichpage=1&#3411515

0
ответ дан 7 December 2019 в 10:08
поделиться

Вы, вероятно, не можете использовать std::map так как это - однородный контейнер. Попробуйте, что-то как boost::variant (они поддерживают шаблон "посетитель"), или boost::tuple

2
ответ дан 7 December 2019 в 10:08
поделиться

То, что Вы пытаетесь сделать, звучит немного странным. Обычно, у Вас был бы контейнер быть набором абстрактных типов или объектов или функций с той же подписью. Иначе, как Вы знали бы, как вызвать функцию при итерации контейнера? Мне нравится делать контейнер набором функциональных объектов с известной подписью, затем использовать Повышение. Свяжите для хранения закрытий, которые вызывают функцию с дополнительными аргументами.

Например:

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");
2
ответ дан 7 December 2019 в 10:08
поделиться

Нет. Вы не можете. Начиная с повышения:: функция не является полиморфной, она повреждается там. (Это берет фиксированный набор типов аргумента.)

Был разговор о работе в том направлении в почтовом списке повышения, тем не менее, так ищите архивы и посмотрите, существует ли некоторый код, Вы могли youse.

Обходное решение должно было бы использовать повышение:: функционируйте, но затем необходимо добавить к карте не реальные функции (т.е. func1/func2), но функции отправки, который извлекает тип из любого - контейнер и вызывает реальную функцию. (И залоги, если это неправильно, так же, как в каком-либо динамическом langugage.)

0
ответ дан 7 December 2019 в 10:08
поделиться

интерфейсы хранилища:

struct IStringData
{
    virtual std::string get() const = 0;
    virtual ~IStringData() {}
};

и сделайте implementaions, каждый будет просто содержать строковое значение, другая реализация сохранит функтор, возможно, у Вас будут другие реализации в будущем.

0
ответ дан 7 December 2019 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: