Вывод std :: string из const char * или char * при создании std :: tuple - PullRequest
0 голосов
/ 23 мая 2019

Мне интересно, есть ли простой способ вывести std::string из const char* при создании кортежа. Это было бы возможно с моей собственной реализацией кортежа, но мне интересно, возможно ли это с std::tuple

Например, в приведенном ниже коде storage_ будет иметь тип:

std::tuple<int, int, const char*>

std::tuple<const char*, char*>

Я хотел бы получить:

std::tuple<int, int, std::string>

std::tuple<std::string, std::string>

#include <tuple>
#include <string>
#include <string.h>
template<typename T>
class foo
{
public:
    foo(T storage) : storage_(std::move(storage)) {}
private:
    T storage_;
};

int main()
{
    char* s2 = strdup("123");

    foo f { std::make_tuple(12,123,"1234") };

    foo f2 { std::make_tuple("321", s2) };

    free(s2);
    // still want to keep s2 stored in f2
}

Я знаю, что могу написать std::tuple<int,std::string> t1 = std::make_tuple(123,"12");, но это не решает мою проблему, так как я хочу, чтобы любое количество аргументов передавалось в любом порядке

Решение: https://wandbox.org/permlink/MsUxZ18SYD1K2ujv

1 Ответ

2 голосов
/ 23 мая 2019

Независимо от того, нужно ли вам это делать или нет, на вопрос все равно можно ответить, как заданный вопрос:

Не думаю, что вы сможете справиться с этим, не предоставив свой собственный make_tuple.

К счастью, большая часть тяжелой работы все еще может быть сделана с помощью std::make_tuple().На самом деле все, что вам нужно сделать, это явно указать аргументы шаблона, вместо того, чтобы выводить их:

template<typename T>
struct Promoted {
    using type = T;
};

template<>
struct Promoted<const char *> {
    using type = std::string;
};

template<typename T>
using Promoted_t = typename Promoted<T>::type;

template<typename... ArgsT>
auto make_my_tuple(ArgsT&&... args) {
    return std::make_tuple<Promoted_t<std::decay_t<ArgsT>>...>(std::forward<ArgsT>(args)...);
}

Отказ от ответственности: Размещенный мною код не предназначен для завершениярешение.Это руководство о том, как я буду решать эту проблему.Вероятно, есть некоторые крайние случаи, которые здесь не рассматриваются.

...