我在理解函数(尤其是模板函数和局部变量)在编译期间的行为时遇到了麻烦。
所以这段代码可以很好地配合std::get
:
enum class UserInfoFields{name, email, address};
using UserInfo = std::tuple<std::string, std::string, std::string>;
int main()
{
UserInfo s{"Edmund", "[email protected] /cdn-cgi/l/email-protection", "Denver street 19"};
std::cout << std::get<static_cast<size_t>(UserInfoFields::name)>(s) << std::endl;
return 0;
}
据我了解,这是因为std::get
是一个模板函数,它需要在编译过程中知道模板参数。这是有道理的static_cast<...
给我们编译期间的值。
我不明白的是,如果我改变main()
代码如下:
int main()
{
UserInfo s{"Edmund", "[email protected] /cdn-cgi/l/email-protection", "Denver street 19"};
auto a = static_cast<size_t>(UserInfoFields::name);
std::cout << std::get<a>(s) << std::endl;
return 0;
}
这是不允许的。我知道我必须使用constexpr
但我想知道,为什么第二个代码不起作用?
你自己写的
std::get
是一个模板函数,它需要在编译过程中知道模板参数
局部变量的值是not(一般情况下)在编译期间已知;局部变量的值是运行时属性。因此,局部变量不能用作模板参数。
如果您想将其用作一个,则必须将其设为编译时值。这是通过使其实现的constexpr
(正如您在问题中也指出的那样)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)