C++ 有没有优雅的方法在多态lambda中写入类型别名

C++ 有没有优雅的方法在多态lambda中写入类型别名,c++,type-alias,C++,Type Alias,考虑以下代码: #include <initializer_list> #include <vector> auto cref_lambda = [] (const auto& il){ using T= typename decltype(il)::value_type; }; auto cval_lambda = [] (const auto il){ using T=typename decl

考虑以下代码:

#include <initializer_list>
#include <vector>

    auto cref_lambda = [] (const auto& il){
        using T= typename decltype(il)::value_type;   
    };

    auto cval_lambda = [] (const auto il){
        using T=typename decltype(il)::value_type;
    };

    int main(){
    std::initializer_list<int> il;
    cref_lambda(il);
    cval_lambda(il);
    }
#包括
#包括
auto-cref_lambda=[](常量自动和il){
使用T=typename decltype(il)::值\类型;
};
自动cval_λ=[](常数自动il){
使用T=typename decltype(il)::值\类型;
};
int main(){
std::初始值设定项\列表il;
克雷夫·拉姆达(伊利诺伊州);
cval_lambda(il);
}
cref_lambda不会编译,因为我们正在尝试将::转换为引用


我知道解决方法(使用
std::remove_reference_t
或仅仅使用
decltype(*il.begin());
),但我想知道这里是否有更好的习惯用法。

解决您手头问题的方法是在
decltype
指令中添加
std::decay_t
。发件人:

将左值应用于右值,数组应用于指针,函数应用于指针隐式转换应用于类型T,删除cv限定符,并将结果类型定义为成员typedef类型

最重要的是,它充当一个类型的标识,而该类型不是根据上述任何注释限定的。因此,书写是安全的

using T = typename std::decay_t<decltype(il)>::value_type;   
或者它是否适用于任何容器

template < typename U >
void cref(U const &il) {
    using T = typename U::value_type;
    /* use T and il */
}

这可能是你能得到的最短时间。

什么是更好?我想使用value\u type,因为我觉得对于第一次阅读代码的人来说,它更清晰。从某种意义上说:啊,它只是初始值设定项列表的值类型的别名。那么
std::remove\u reference\t
有什么问题吗?似乎它几乎不会降低可读性。如果你想缩短它,你可以使用
decation\t
。你的用例有点做作。由于lambda不能捕获任何内容,所以可以使用一个免费的模板函数,比如
void cref(std::initializer\u list const&il){/*使用t和il*/}
。这样你就可以免费得到
T=value\u type
。@HenriMenke现在当我想到它的时候,我想你可能是对的。。。请随意在A中移动您的评论,如果在另一个A中没有任何聪明的东西出现,我将接受它。
template < typename U >
void cref(U const &il) {
    using T = typename U::value_type;
    /* use T and il */
}
auto cref_lambda = [] <typename U> (U const &il){
    using T = typename U::value_type;
};