Как написать переменную функцию без пакета параметров?

Класс является целым числом, если вы переносите переменную в as.character as.date можете ее прочитать.

sapply(data, class)
data$date.of.review  <- as.Date(as.character(data$Date_String), "%Y%m%d")
data
2
задан max66 13 July 2018 в 19:55
поделиться

2 ответа

Просто используйте два пакета параметров:

template<typename Bar, typename... Bars, typename Input, typename... Inputs>
std::string foo(const Input &input, const Inputs &... inputs)
{
    std::string result(Bar::get_name());
    result.append(input);

    if constexpr (sizeof...(inputs) > 0)
        result.append(foo<Bars...>(inputs...));

    return result;
}
3
ответ дан r3mus n0x 17 August 2018 в 12:11
поделиться
  • 1
    Это выглядит многообещающим, но когда я пытаюсь восстановить шаблон, расширенные входы становятся барами. У вас есть ссылки на пример, который я мог бы, ну, скопировать? – user44168 13 July 2018 в 20:24
  • 2
    Чтобы это было просто, давайте просто предположим, что каждый класс Bar имеет статический метод std :: string get_name (), и foo объединяет имена, вставляя некоторые разделители строк (Входы) между ними. – user44168 13 July 2018 в 20:30
  • 3
    @ user44168, я обновил пример с помощью тела, основанного на том, что вы указали в своем вопросе. Однако для завершения рекурсии используется функция C ++ 17 if constexpr. Можете ли вы использовать C ++ 17, или вы можете использовать только C ++ 11? – r3mus n0x 13 July 2018 в 20:36
  • 4
    @ user44168, снова обновленный конкатенацией строк. – r3mus n0x 13 July 2018 в 20:43
  • 5
    Спасибо за редактирование с помощью решения! Моя ошибка заключалась в расширении обеих пакетов как & lt; Bars ..., Inputs ... & gt ;. Проект находится на C ++ 14, поэтому я закончил рекурсию с отдельным определением bar & lt; typename Bar, typename Arg & gt ;. – user44168 13 July 2018 в 20:44

Не знаете, что вы хотите ...

Если Result и Input являются типами, а не параметрами шаблона, и вы хотите, чтобы шаблон foo() получал столько Input объекты шаблона, вы можете начать с настраиваемого параметра шаблона GetFirst, чтобы выбрать первый параметр шаблона в вариационном списке

template <typename T0, typename ...>
struct GetFirst
 { using type = T0; };

и записать foo() следующим образом

template <typename ... Bars>
Result foo (typename GetFirst<Input, Bars>::type const & ... is)
 { 
   // something with is...
   return {};
 }

Итак, у вас есть

//foo<long, long long>(Input{}, Input{}, Input{}); // compilation error

foo<int, long, long long>(Input{}, Input{}, Input{}); // compiles

//foo<int, long, long long>(Input{}, Input{}); // compilation error

Если вы хотите рекурсивно управлять одиночным is..., вы можете записать foo() следующим образом

template <typename, typename ... Bars>
Result foo (Input const & i0,
            typename GetFirst<Input, Bars>::type const & ... is)
 {
   // do something with i0

   return foo<Bars...>(is...);
 }

, но вам также нужно шаблон основного фрейма foo() для прекращения рекурсии; Я предлагаю foo(), которые получают параметр нестандартного шаблона со значением по умолчанию (для перехвата Bars..., когда список пуст)

template <int = 0>
Result foo ()
 { return {}; }

Ниже приведен полный, возможно, глупый, но компилирующий пример

struct Input  { };
struct Result { };

template <typename T0, typename ...>
struct GetFirst
 { using type = T0; };

// ground case
template <int = 0>
Result foo ()
 { return {}; }

// recursive case
template <typename, typename ... Bars>
Result foo (Input const & i0,
            typename GetFirst<Input, Bars>::type const & ... is)
 {
   // do something with i0

   return foo<Bars...>(is...);
 }

int main()
 {
   //foo<long, long long>(Input{}, Input{}, Input{}); // compilation error

   foo<int, long, long long>(Input{}, Input{}, Input{}); // compiles

   //foo<int, long, long long>(Input{}, Input{}); // compilation error
 }
1
ответ дан max66 17 August 2018 в 12:11
поделиться
Другие вопросы по тегам:

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