lambda参数转换为constexpr技巧,然后获取带链接的数组
lambda-parameter to constexpr trick, then get array with linkage
我发现了一个用例,在这个用例中,向函数提供lambda,并让该函数调用lambda来获得constexpr结果是很方便的(我的真实用例涉及将lambda传递给另一个lambda,其中第一个lambda返回从访问者模式获得的值……但这与我的核心问题无关(。
我正试图得到一个数组";具有联动装置";然后我可以将其用作其他函数的模板参数。我看到了一个非常奇怪的错误;类型的引用的初始化无效"除非我:
- 使函数CCD_ 1成为具有丢弃模板参数的模板函数
或
- 为函数
arrWithLinkage1
提供显式返回类型,例如const array<size_t, 3>&
而不是const auto&
我找到了一个变通方法,使用函数arrWithLinkage2
,但我担心我可能会进入未定义行为的领域。有人知道吗?
现场示例:https://onlinegdb.com/By9nDmsyw
编辑:感谢Ted(下面的评论(,看起来核心问题是:use of 'auto' in parameter declaration only available with '-fconcepts-ts'
因此,这让我对下面使用template<typename Lam>
的解决方案感到更舒服,除非有人有其他理由。。。?
// Test that array has linkage
template<auto& arr>
void test() {}
// Get array with linkage
template<size_t... vals>
constexpr auto valsToArr = array<size_t, sizeof...(vals)>{ vals... };
// Lambda to array with linkage
template<size_t... Idx>
constexpr auto& arrWithLinkage(auto lam, index_sequence<Idx...>) {
return valsToArr<lam()[Idx]...>;
}
template<size_t=0> // Only works with this...
constexpr auto& arrWithLinkage1(auto lam) {
constexpr size_t N = lam().size();
return arrWithLinkage(lam, make_index_sequence<N>{});
}
template<typename Lam> // A little less gross-looking, but still concerned that this is UDB
constexpr auto& arrWithLinkage2(Lam lam) {
constexpr size_t N = lam().size();
return arrWithLinkage(lam, make_index_sequence<N>{});
}
int main()
{
auto lam = [](){ return array{1, 2, 3}; };
constexpr const array<size_t, 3>& res = arrWithLinkage1(lam);
test<res>();
return 0;
}
已解决:
(如果Ted的评论是一个答案,他会把它标记为"解决方案",谢谢Ted!(
-
Ted让我意识到问题确实是我在参数中使用了
auto
。使用template<typename Lam>
确实是一个可以接受的解决方案。从我在谷歌上搜索上述错误并看到其他人做类似的事情来看,我认为解决方案是"定义的行为";。 -
我想出了一个更好的整体方法。只需让lambda从一开始就向具有链接的
arrWithLinkage1
0数组返回引用(使用通过模板参数接受一组参数值的模板变量(。
示例:https://onlinegdb.com/Sy-qx3skw
// Test that array has linkage
template<auto& arr>
void test() {
for(auto& val : arr)
cout << val << ", ";
cout << endl;
}
// Get array with linkage
template<size_t... vals>
constexpr auto valsToArr = array<size_t, sizeof...(vals)>{ vals... };
int main()
{
// Just make the lambda return a reference to a constexpr array to begin with
// Avoid the need to convert it to a param pack, then an array template variable
// in order to obtain an array with linkage, that can be passed to test<>()
auto lam = []() -> auto& { return valsToArr<1, 2, 3>; };
constexpr auto& res = lam();
test<res>();
return 0;
}
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 无法使函数公开。获取:"LNK2005"错误。如何调试链接器错误
- 错误 VSP1011:无法获取调试信息.与 /配置文件链接器开关链接
- 获取链接 创建flyweight_pattern时出错
- 使用自定义工具集获取动态退出析构函数链接错误 - eh 矢量析构函数
- 在可视化解决方案 c++ 中获取链接器错误
- 获取 constexpr 全局变量(不是静态成员)的链接器符号
- C++程序调用 C 函数 在 g++ 链接期间获取未定义的引用
- 如何在Visual Studio中的库编译时间中获取链接器错误
- 哪种方法更好获取静态链接DLL的模块句柄(HMODULE) - 使用GetModuleHandleEx()或LoadLibrary()?
- 在对类对象的赋值进行链接时获取垃圾值,使用按值返回类对象的赋值运算符重载
- 获取无效或损坏的文件LNK1107:尝试链接 OpenSceneGraph 教程.dll时无法0x378读取
- 在Visual C 项目中获取链接错误
- 在 VS 中,以编程方式获取链接器>其他库目录属性,或获取宏值
- 视觉获取链接错误:C++中的外部.如何访问在文件 A 中修改的变量的值.CPP在另一个文件 B .CPP中修改
- 如何在右键单击链接并从上下文菜单访问功能后获取链接的 DOM
- 获取链接器错误
- Qt中新的获取链接器和Makefile错误
- 重载模板类的运算符<<时获取链接器错误
- C++从html代码中获取链接