Действительно ли возможно реализовать формулу Haversine в Objective C и назвать его от SQLite?

Существует два вида reflection плавание вокруг.

  1. Контроль путем итерации по членам типа, перечисления его методов и так далее.

    Это не возможно с C++.
  2. Контроль путем проверки, имеет ли тип класса (класс, структура, объединение) тип метода или вложенный тип, получен из другого конкретного типа.

    Такого рода вещь возможна с C++ с помощью template-tricks. Используйте boost::type_traits для многих вещей (как проверка, является ли тип неотъемлемой частью). Для проверки существование функции членства используйте , он возможный записать шаблон для проверки на function' s существование? . Для проверки, существует ли определенный вложенный тип, используйте плоскость SFINAE.

, Если Вы скорее ищете способы выполнить 1), как взгляд, сколько методы класс имеют, или как получение строкового представления идентификатора класса, тогда я боюсь, что нет никакого Стандартного C++ способа сделать это. Необходимо использовать любой

  • Метакомпилятор А как спокойный Компилятор Метаобъекта, который переводит код, добавляющий дополнительную meta информацию.
  • Платформа А constisting макросов, которые позволяют Вам добавлять необходимую метаинформацию. Необходимо было бы сказать платформе все методы, имена классов, базовые классы и все, в чем она нуждается.

C++ сделан со скоростью в памяти. Если Вы хотите высокоуровневый контроль, как C#, или Java имеет, то я боюсь, что должен сказать Вам, что нет никакого пути без некоторого усилия.

5
задан brianegge 8 November 2009 в 07:30
поделиться

2 ответа

Мне просто повезло с этим постом: http://www.thismuchiknow.co.uk/?p=71

4
ответ дан 14 December 2019 в 04:41
поделиться

Здесь демонстрируется функция sqlite, которая принимает один строковый параметр и возвращает строковый результат.

В вашем случае вам понадобится функция, которая считывает четыре числа с плавающей запятой и возвращает число с плавающей запятой, но принцип тот же (вы должны заменить sqlite3_value_text на sqlite3_value_double и sqlite3_result_text с sqlite3_result_double ):

#include <stdlib.h>
#include <sqlite3.h>
#include <stdio.h>


void haver(sqlite3_context* ctx,int cnt,sqlite3_value** val)
{
    printf("In SQLite haver implementation, called for value: %s\n", sqlite3_value_text(*val));

    char * resultOfCall = "Result of function call"; //this would call the distance function
    sqlite3_result_text(ctx, resultOfCall, strlen(resultOfCall), NULL);
}
int cback (void* udata,int ncol,char** value,char** colname)
{
    int i=0;
    for(;i<ncol;i++)
    printf("Result column: %s value: %s   \n", colname[i], value[i]);
    return 0;
}
int main()
{

    sqlite3 * handle;
    int res = sqlite3_open("./test.sql", &handle);

    res = sqlite3_create_function(handle, "haver", 1, SQLITE_UTF8, NULL, &haver, NULL, NULL);

    char * errmsg = NULL;   
    res = sqlite3_exec(handle, "select haver(w) from t", &cback, NULL, &errmsg);
    printf("sqlite3_exec result: %d %s\n", res, errmsg != NULL ? errmsg : "No error");

    sqlite3_close(handle);
}
4
ответ дан 14 December 2019 в 04:41
поделиться