- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试实现类似 Rust 的 Result<T,E>
的东西在 C++ 中键入,它是一个包含 T
的 union 或 E
值(value)。
它的一些构造函数是:
template <typename T, typename E>
Result<T,E>::Result(const T& value) : isOk(true), value(value) {}
template <typename T, typename E>
Result<T,E>::Result(T&& value) : isOk(true), value(std::move(value)) {}
它按我对 T
的预期工作和 E
是非引用类型或指针,但如果任何基础类型是引用,则无法编译。例如:
MyType my_object;
Result<MyType&, AnyOtherType> result(my_object);
产生以下错误:
./result.h:46:5: error: multiple overloads of 'Result' instantiate to the same signature 'void (MyType &)'
Result(T&& value);
^
main.cpp:39:23: note: in instantiation of template class 'Result<MyType &, int>' requested here
Result<MyType&,int> result(object);
^
./result.h:37:5: note: previous declaration is here
Result(const T& value);
^
我知道这是因为引用折叠规则 (& + && = &): if T
是MyType&
, 然后 T&
和 T&&
都是MyType&
,因此这两个构造函数在这里具有相同的签名。
但是有什么好的方法可以克服这个问题,并允许 T
作为引用,同时仍然拥有const T&
和 T&&
构造函数?
最佳答案
您可以使用带有转发引用的模板化构造函数来涵盖这两种情况:
template<typename T>
struct Result {
template<typename... S>
Result(S&&... s) : t(std::forward<S>(s)...) {}
T t;
};
int i;
Result<int&> r1(i);
Result<int> r2(i);
相关论文std::expected<R, E>
提案:
关于c++ - 如何覆盖 aguments `const T&` 和 `T&&` 的通用函数,其中 T 可以作为引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56544509/
我想将 rpart 函数中的拆分方法从“gini”(默认)更改为“information”。 在帮助部分我们有这个例子: fit2 <- rpart(Kyphosis ~ Age + Number +
我知道可以在源 fragment 中使用 Action 传递单个参数 override fun onClick(v: View) { val amountTv: EditText =
我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框,并使用对话框消息的参数,如 StackOverflow thread 中所述。和 DialogFragment
我正在尝试实现类似 Rust 的 Result 的东西在 C++ 中键入,它是一个包含 T 的 union 或 E值(value)。 它的一些构造函数是: template Result::Resu
我是一名优秀的程序员,十分优秀!