在std :: forward中使用std :: decay

问题描述

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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...