C 呼叫功能具有许多不同类型
C++ call function with many different types
我有一个超载功能,我必须使用许多不同类型的函数。简单的方法是:
uint8_t a;
uint16_t b;
//....
double x;
doSomething(a);
doSomething(b);
//...
doSomething(x);
可以用一个Q& a说明的变异模板来简洁地表达这些呼叫。该代码看起来有点像这样:
auto doSomethingForAllTypes = [](auto&&... args) {
(doSomething(args), ...);
};
uint8_t a;
uint16_t b;
//....
double x;
doSomethingForAllTypes(a, b, ... ,x);
,但是我必须在代码的许多地方进行此操作,因此我想仅定义一次类型列表。我想拥有像这样的概念上看起来的代码:
auto doSomethingForAllTypes = [](auto&&... args) {
(doSomething(args), ...);
};
someContainer allTypesNeeded(uint8_t, uint16_t, ... double);
doSomethingForAllTypes(allTypesNeeded);
如何完成?
带有一些锅炉板来获得元组,您可以按照以下方式实现您想要的东西:
#include <tuple>
#include <utility>
namespace detail
{
template<typename T, typename F, std::size_t... Is>
void for_each(T&& t, F f, std::index_sequence<Is...>)
{
( static_cast<void>(f(std::get<Is>(std::forward<T>(t)))),... );
}
}
template<typename... Ts, typename F>
void for_each_in_tuple(std::tuple<Ts...> const& t, F f)
{
detail::for_each(t, f, std::index_sequence_for<Ts...>{});
}
int main() {
std::tuple<uint8_t, uint16_t, double> tup{};
for_each_in_tuple(tup, [](auto&& arg) {
doSomething(arg);
});
}
实时示例
如果您想拥有一个预定义的类型序列,则可以使用Typelist aventer,如果您不想创建带有参数的元组:
#include <type_traits>
#include <utility>
void doSomething(int)
{
}
void doSomething(double)
{
}
template <typename... Args>
void doSomething(Args&&... args)
{
(doSomething(std::forward<Args>(args)), ...);
}
template <typename ...Args>
struct TypeList{};
template <typename T>
struct DoSomethingHelper;
template <typename ...Args>
struct DoSomethingHelper<TypeList<Args...>>
{
static void doSomething(Args&&... args)
{
::doSomething(std::forward<Args>(args)...);
}
};
template <typename T, typename ...Args>
void doSomethingForTypes(Args&&... args)
{
DoSomethingHelper<T>::doSomething(std::forward<Args>(args)...);
}
int main()
{
using MyTypeList = TypeList<int, double, int>;
doSomethingForTypes<MyTypeList>(1, 1.0, 2);
}
带有std::tuple
和std::apply
std::tuple<uint8_t, uint16_t, double> tup{};
std::apply([](const auto&... arg) { (doSomething(arg), ...); }, tup);
相关文章:
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 类中的字符串不命名类型
- 不完整类型错误(E0409、E0070、E0515)
- CRTP 单一实例不完整类型或非文本类型
- 使用具有结构不完整类型错误的模板
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- Xalloc 不命名类型
- (结构名/类名)不命名类型C++
- 是否允许类类型的 std::function 成员变量(不完整类型)?
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 为什么我得到变量"Node"不是类型名称错误
- Visual Studio Code "variable " u8 的 C/C++ 扩展名 " " 不是类型名称"
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- C++ 外部类不命名类型
- C++ 类型类的变量声明不命名类型?
- 如何在不违反类型别名规则的情况下解释消息负载?
- msgpack:在不知道类型的情况下解包自定义类
- 不允许将SDL_Cursor与unique_ptr:error不完整类型一起使用
- 我如何实现递归函数的模板,该模板允许C 中的许多不确定数据类型的参数