gpt4 book ai didi

c++ - 由于引用崩溃导致不明确的过载

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:10 24 4
gpt4 key购买 nike

我经常使用代码示例中显示的模板类来构建新类型,以防止我传递错误的参数、错误顺序的参数并记录参数的含义。请参见代码示例中的数字 (2)。

但有一件事有点麻烦:我不能将此类用于引用类型(请参见代码示例中的编号 (3))。当然这不起作用,因为引用折叠使我的构造函数变得模棱两可,这就是为什么我禁用 T&& 构造函数(请参见代码示例中的编号 (1))以使示例工作。但我希望这只是次优解决方案?

问题:有没有一种方法可以使用 StrongType 类,在非引用类型的情况下保留两个构造函数,而无需为引用类型创建像 StrongTypeRef 这样的特殊类?

该示例按原样编译。 要查看错误,请通过取消注释启用数字 (1)。

提前致谢!

#include <iostream>

template <typename T, typename Parameter>
class StrongType
{
public:
explicit StrongType(T const& value) : value_(value) {}
// (1) explicit StrongType(T&& value) : value_(value) {}
T& get() { return value_; }
T const& get() const {return value_; }
private:
T value_;
};

// (2) works great
using Iteration = StrongType<int, struct IterationType>;

// (3) Not o.k.
using IterationRef = StrongType<int&, struct IterationRefType>;

void do_something1(Iteration k)
{
std::cout << k.get();
}

void do_something2(IterationRef k)
{
k.get() = 42;
}

int main(int argc, const char * argv[]) {
Iteration it1(5);
do_something1(it1);

int refed = 0;
IterationRef it2(refed);
do_something2(it2);
return 0;
}

最佳答案

如果你使用完美转发,那么它会起作用:

template <typename T, typename Parameter>
class StrongType
{
public:
template <class U>
explicit StrongType(U&& value) : value_(std::forward<U>(value)) {}
T& get() { return value_; }
T const& get() const {return value_; }
private:
T value_;
};

实例:http://coliru.stacked-crooked.com/a/a78cb4617961f3c9

关于c++ - 由于引用崩溃导致不明确的过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46134874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com