gpt4 book ai didi

c++ - 确定 C++ 模板仿函数的参数数量

转载 作者:行者123 更新时间:2023-11-28 00:57:00 27 4
gpt4 key购买 nike

假设我们有:

template<typename F, typename T1, typename T2>
void my_magic_method(F func, T1 t1, T2 t2)
{
if (???)
func(t1);
else
func(t1,t2);
}

什么可以帮助我确定:

  1. 参数个数

  2. 可能每个参数的类型

  3. 返回值类型

由于 MSVS 2010...,我无法使用可变参数模板...

更新

我的第一个解决方案:

template<typename F>
auto my_magic_func(F f) -> decltype(f(1))
{
return f(1);
}

template<typename F>
auto my_magic_func(F f, void * fake = NULL) -> decltype(f(2,3))
{
return f(2,3);
}

int main()
{
auto x1 = my_magic_func([](int a){ return a+100; });
auto x2 = my_magic_func([](int a, int b){ return a*b; });
// x1 == 1+100
// x2 == 2*3
}

这就是我的函数类型重载方式。它有效,但也许是更好的解决方案?

最佳答案

不完全是你要求的,但如果我正确理解你的意图,在 VC++ 2010 中可以(但丑陋)通过基于元数的简单重载:

#include <utility>
#include <string>
#include <iostream>

template<typename F, typename T1>
auto my_magic_method(F&& func, T1&& t1) ->
decltype(std::forward<F>(func)(std::forward<T1>(t1)))
{
return std::forward<F>(func)(std::forward<T1>(t1));
}

template<typename F, typename T1, typename T2>
auto my_magic_method(F&& func, T1&& t1, T2&& t2) ->
decltype(std::forward<F>(func)(std::forward<T1>(t1), std::forward<T2>(t2)))
{
return std::forward<F>(func)(std::forward<T1>(t1), std::forward<T2>(t2));
}

struct string_to_float_functor
{
float operator ()(std::string const& s) const
{
return std::stof(s);
}
};

int main()
{
auto a = my_magic_method([](std::string const& x) { return x + x; }, "foo");
auto b = my_magic_method([](double x, int y) { return x * y; }, 21.5, 3);
auto c = my_magic_method(string_to_float_functor(), "3.14159265");
std::cout << a << '\n' << b << '\n' << c << '\n';
}

这支持一元和二元仿函数——继续该模式并根据需要为其他元数添加重载。

关于c++ - 确定 C++ 模板仿函数的参数数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557692/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com