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

301
28 сентября 2017, 15:02

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

template<class T>
struct Ok {
    T value;
};
template<> struct Ok<void> {};
// template deduction guides
template<class T> Ok(T) -> Ok<T>;

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

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

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

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

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

Answer 1
template<class T>
Ok<std::decay_t<T>> makeOk(T&& arg){
  return Ok<std::decay_t<T>>{std::forward<T>(arg)};
}
auto c = makeOk(5);
auto d = makeOk(std::make_unique<double>(6.7));
Answer 2

Начал писать как комментарий, но не уложился в границы.

Ответ уже дан, но по большому счёту он был у Вас в вопросе, когда сравнивали конструктор с функцией.

Классическое решение - это как раз использование шаблонных make- функций. Всякие make_pair, make_unique, make_shared яркие тому примеры.

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

READ ALSO
Генерация чисел c++

Генерация чисел c++

Имеется следующий код:

189
Какой именно enter нажат?

Какой именно enter нажат?

Как определить, какой из двух enter'ов нажат(num pad или основной)?

238
Как создать dll?

Как создать dll?

Добрый вечер - установил visual studio 2017 почти со всеми дополнениями:Не ставил Node и ASPПодскажите как мне создать dll для C++?Не могу найти Win32 вкладку...

265
Странный вывод в qr creator C++ [требует правки]

Странный вывод в qr creator C++ [требует правки]

При вычислениях компилятор выдаэт такие числа как 126е^+0291

221