Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Как переписать Template deduction guide (С++17) на C++14?

#cpp #cpp14 #шаблоны_с++ #cpp17


Дан код на С++17: 

template
struct Ok {
    T value;
};
template<> struct Ok {};

// template deduction guides
template Ok(T) -> Ok;


Template deduction guides позволяют имея тип Ok вызывать Ok как функцию (так выглядит,
на самом деле вызывается конструктор):

auto c = Ok(5); // T deduced as int
// без template deduction guide я так писать не могу, 
// но должен писать:
auto c = Ok(5); // T can not be deduced :(


Вопрос в том, как это переписать на С++14 или ниже? Чтоб я писал просто: 

auto c = Ok("hello"s);  // T deduced as std::string


Но с произвольным типом.
    


Ответы

Ответ 1



template Ok> makeOk(T&& arg){ return Ok>{std::forward(arg)}; } auto c = makeOk(5); auto d = makeOk(std::make_unique(6.7));

Ответ 2



Начал писать как комментарий, но не уложился в границы. Ответ уже дан, но по большому счёту он был у Вас в вопросе, когда сравнивали конструктор с функцией. Классическое решение - это как раз использование шаблонных make- функций. Всякие make_pair, make_unique, make_shared яркие тому примеры. Дополнительно хочу заметить, что если тип Ok явно указывается только при создании (через функцию-конструктор), то можно зайти немного с другого конца, нежели это сделал Виктор Смирнов в своём ответе, и в качестве имени порождающей функции использовать Ok вместо makeOk. А саму структуру переименовать, скажем, в Ok_. Может быть таким образом получится уменьшить количество мест, требующих изменения кода.

Комментариев нет:

Отправить комментарий