问题描述
template<typename T>
struct test
{
std::string key;
T value;
template<typename U>
using decay = typename std::decay<U>::type;
template<typename U = decay<T>,typename US = decay<std::string>>
test(U&& _value,US&& _key) : value(std::forward<U>(_value)),key(std::forward<US>(_key)){}
};
我几乎在每个项目中都使用这种衰减。我想问一下,写这样的东西是否好用呢?
test(T&& _value,std::string&& _key) : value(std::move(_value)),key(std::move(_key)){}
test(const T& _value,std::string&& _key) : value(_value),key(std::move(_key)){}
test(T&& _value,const std::string& _key) : value(std::move(_value)),key(_key){}
test(const T& _value,const std::string& _key) : value(_value),key(_key){}
解决方法
您想得太多。您只需要这个:
template<typename T>
struct test
{
std::string key;
T value; // as a safety this could be replaced by:
// typename std::decay<T>::type value;
template<typename U,typename US>
test(U&& _value,US&& _key)
: value(std::forward<U>(_value)),key(std::forward<US>(_key))
{}
};
这种完美的转发将确保您列出的所有构造函数均可用。
您似乎不了解std::decay
的功能或使用时间/方式。
示例:decay<std::string>
是没有意义的,因为它仅表示std::string
类型,因此您应该只写std::string
,因为您完全控制传递给{{ 1}},您知道此类型不包含引用或const,因为您已明确键入此类型。
decay
对于定义可以分配给它的类型的变量/文件很有用。它去除引用和常量性,C数组转换为指针,并确保指向函数的指针。请参见doc示例。
您能解释一下使用模板参数的默认类型实现的计划吗?我不明白你在这里打算什么。
,如果两个值实际上都保存在您的类中,则比这简单得多:
arrow_coords = (PL.rectangle().right - 5,PL.rectangle().bottom - 5)
for i in range(N):
PL.click_input(coords=arrow_coords)