给定 C++17 中的代码:
template<class T>
struct Ok {
T value;
};
template<> struct Ok<void> {};
// template deduction guides
template<class T> Ok(T) -> Ok<T>;
模板推导指南允许将类型作为函数Ok<T>调用Ok(这是它的样子,实际上,构造函数被调用):
auto c = Ok(5); // T deduced as int
// без template deduction guide я так писать не могу,
// но должен писать:
auto c = Ok<int>(5); // T can not be deduced :(
问题是如何在 C++14 或更低版本中重写它?让我简单地写:
auto c = Ok("hello"s); // T deduced as std::string
但是具有任意类型。
我开始写评论,但不符合界限。
答案已经给出,但总的来说,当您将构造函数与函数进行比较时,它就在您的问题中。
经典的解决方案就是使用模板
make-函数。各种,make_pair生动的例子。make_uniquemake_shared此外,我想指出,如果
Ok仅在创建期间(通过构造函数)显式指定类型,那么您可以从另一端比 Viktor Smirnov 在他的回答中做的稍微多一点,并使用Ok而不是makeOk. 并将结构本身重命名为Ok_. 也许这样可以减少需要更改代码的地方的数量。