Как выглядит заголовок С? Где-то источник C должен перечислять допустимые типы обратного вызова. Вы должны воспользоваться этой возможностью, чтобы иметь ряд макросов, которые генерируют прототипы для отдельных функций заглушки, с соответствующей последовательностью макросов в источнике C ++, генерирующим extern "C"
заглушки.
Что касается второго вопроса : Да, это работает, но typedef
не находится внутри шаблона. Я попытался поместить такой тип typedef внутри класса, но оказывается, что даже шаблоны классов не допускаются внутри extern "C"
. Таким образом, у вас может быть шаблон функции, но нет параметров зависимого типа.
Простое определение этой функции легко:
extern "C" typedef void ftype(int);
template<typename T>
static ftype f; // <- added "static" here
template< typename T >
void f(int q) {}
Aha, вариативные функции!
extern "C" typedef void ftype( int, ... );
template<typename T>
static ftype f;
template< typename T >
static void f( int z, ... ) {
va_list va;
va_start( va, z );
T v = va_arg( va, T );
va_end( va );
std::cout << v;
}
Вам действительно не нужно выводить тип, поскольку это всего лишь обратный вызов, поэтому вы можете передать это & f<int>
в код C, все обратные вызовы имеют один и тот же тип, и он может сделать определение типа во время выполнения и передать все он хочет через varargs.
dateTimeWithTimeZone = Instant.now().toString();
System.out.println(dateTimeWithTimeZone);
Когда я только что запустил этот фрагмент, я получил такой вывод:
2019-03-18T22: 28: 13.549319Z
blockquote>На странице, на которую вы ссылаетесь, непонятно, но это строка ISO 8601 в UTC, так что должно быть все, что вам нужно. Я пользуюсь тем фактом, что классы java.time создают выходные данные ISO 8601 из своих методов
toString
. Связанная страница показывает формат с дефисами,T
и двоеточиями (2008-09-15T15:53:00+05:00
), показывает еще один пример с десятичными знаками на секундах (15:53:00.322348
) и третий пример сZ
, означающим UTC (20080915T155300Z
) поэтому я ожидаю, что комбинация всех трех из них тоже будет в порядке.Формат, который вы использовали в квестоне, похоже, пытается получить смещение как
+00:00
, а неZ
. Если это требование, это только немного сложнее. Мы используем явный модуль форматирования для контроля изменений в ISO 8601:DateTimeFormatter iso8601Formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx"); dateTimeWithTimeZone = OffsetDateTime.now(ZoneOffset.UTC).format(iso8601Formatter); System.out.println(dateTimeWithTimeZone);
2019-03-18T22: 28: 13.729711 + 00: 00
blockquote>Что что-то пошло не так в вашем коде?
Вы пытались использовать символы форматирования из вашего источника с
SimpleDateFormat
. Во-первых, вы никогда не должны, и особенно в Java 8 или новее, хотеть использоватьSimpleDateFormat
. Этот класс, как известно, хлопотно и давно устарел. Во-вторых, некоторые из его букв шаблонного формата соответствуют символам из вашего источника, а некоторые - нет, поэтому вы не можете просто использовать строку symvol оттуда. Вместо этого вам нужно прочитать документацию и найти правильные буквы шаблонов формата для использования в качестве года, месяца и т. Д. И помните, что они чувствительны к регистру:MM
иmm
различаются.Ссылка
Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.