【发布时间】:2022-01-11 23:01:20
【问题描述】:
我看到了一些类似的问题,但他们似乎没有明白这一点。
我可以在模板上重载一个函数:
template <typename T> void foo(); // Called as e.g., foo<int>();
template <std::size_t I> void foo(); // Called as e.g., foo<2>();
有没有办法对班级做类似的事情,我可以有MyClass<int> 或MyClass<2>?
我看不出有什么办法。 (我的真正目标是拥有一个可调用的 static constexpr 实例,其行为类似于 std::get。而 std::get 在其“索引”参数和参数类型上被模板化,我想制作一个可调用的就其本身而言,所以myns::get<2> 和myns::get<int> 都是可调用的,并且在调用时的行为分别类似于std::get<2>(tup) 和std::get<int>(tup)。
您天真地希望这样的事情会起作用,但 auto 是一种类型:
template <auto IndOrType>
constexpr auto get = [](auto&& tup) {
return std::get<IndOrType>(std::forward<decltype(tup)>(tup));
};
我可以创建一个返回 lambda 的 getter 函数,然后使用 () 调用它,如 myns::get<2>()(tup) 或 myns::get<int>()(tup)。
【问题讨论】: