Const 映射及其大小
Const map and its size
我有一个无法在运行时更改的 std::map
。因此,我将其标记为 const
我不能将其标记为 constexpr
,因为它是非文字类型。
我可以在编译时推导出这张图的size
吗?
#include <map>
#include<string>
int main (){
const std::map <int, std::string> my_map {
{ 42, "foo" },
{ 3, "bar" }
};
constexpr auto items = my_map.size();
return items;
}
This 没有编译错误:
:10:20: error: constexpr variable 'items' must be initialized
by a constant expression
constexpr auto items = my_map.size();
^ ~~~~~~~~~~~~~
:10:35: note: non-constexpr function 'size' cannot be used in
a constant expression
constexpr auto items = my_map.size();
Can I deduce the size
of this map at compile time?
没有。由于 my_map
不是编译时常量,因此您不能在编译时使用它。
该标准不提供编译时映射,但应该有库,或者如果您确实需要,您可以自己制作。
如果通过模板函数初始化地图是可以的
template<class... Args>
std::pair<std::integral_constant<std::size_t, sizeof...(Args)>, std::map<int, std::string>>
make_map(Args&& ...args)
{
return {{}, std::map<int, std::string>({std::forward<Args>(args)...})};
}
int main() {
const auto& p = make_map(
std::make_pair( 42, std::string("foo") ),
std::make_pair( 3, std::string("bar") )
);
constexpr std::size_t size = std::decay_t<decltype(p.first)>::value;
const auto& my_map = p.second;
//or const auto my_map = std::move(p.second);
}
遗憾的是,您不能在 constexpt 上下文中使用 std::map 和 std::string。如果可能,请考虑切换到数组和 string_view:
int main() {
constexpr std::array my_map{
std::pair<int, std::string_view>{ 42, "foo" },
std::pair<int, std::string_view>{ 3, "bar" }
};
constexpr auto items = my_map.size();
return items;
}
然后使用constexpr std算法
我有一个无法在运行时更改的 std::map
。因此,我将其标记为 const
我不能将其标记为 constexpr
,因为它是非文字类型。
我可以在编译时推导出这张图的size
吗?
#include <map>
#include<string>
int main (){
const std::map <int, std::string> my_map {
{ 42, "foo" },
{ 3, "bar" }
};
constexpr auto items = my_map.size();
return items;
}
This 没有编译错误:
:10:20: error: constexpr variable 'items' must be initialized by a constant expression
constexpr auto items = my_map.size(); ^ ~~~~~~~~~~~~~
:10:35: note: non-constexpr function 'size' cannot be used in a constant expression
constexpr auto items = my_map.size();
Can I deduce the
size
of this map at compile time?
没有。由于 my_map
不是编译时常量,因此您不能在编译时使用它。
该标准不提供编译时映射,但应该有库,或者如果您确实需要,您可以自己制作。
如果通过模板函数初始化地图是可以的
template<class... Args>
std::pair<std::integral_constant<std::size_t, sizeof...(Args)>, std::map<int, std::string>>
make_map(Args&& ...args)
{
return {{}, std::map<int, std::string>({std::forward<Args>(args)...})};
}
int main() {
const auto& p = make_map(
std::make_pair( 42, std::string("foo") ),
std::make_pair( 3, std::string("bar") )
);
constexpr std::size_t size = std::decay_t<decltype(p.first)>::value;
const auto& my_map = p.second;
//or const auto my_map = std::move(p.second);
}
遗憾的是,您不能在 constexpt 上下文中使用 std::map 和 std::string。如果可能,请考虑切换到数组和 string_view:
int main() {
constexpr std::array my_map{
std::pair<int, std::string_view>{ 42, "foo" },
std::pair<int, std::string_view>{ 3, "bar" }
};
constexpr auto items = my_map.size();
return items;
}
然后使用constexpr std算法