模板参数推导问题
#include <boost/lexical_cast.hpp>
template <typename T, T f> struct WapperFunction;
template <typename RetType, RetType (*f)()>
struct WapperFunction<RetType(*)(), f>
{
static void call()
{
RetType x = f();
printf("Call result of 0X%p {%s} is %s {%s}\n\n", f, typeid(f).name(),
boost::lexical_cast<std::string>(x).c_str(), typeid(x).name());
}
};
template <typename RetType, typename Arg1Type, RetType (*f)(Arg1Type)>
struct WapperFunction<RetType(*)(Arg1Type), f>
{
static void call()
{
Arg1Type arg1;
RetType ret;
printf("Enter the argument1{%s}:", typeid(Arg1Type).name());
std::cin>>arg1;
ret = f(arg1);
printf("Call result of 0X%p {%s} is %s {%s}\n\n", f, typeid(f).name(),
boost::lexical_cast<std::string>(ret).c_str(), typeid(ret).name());
}
};
int f1()
{
return 0;
}
int f2(int x)
{
return x * x;
}
int main()
{
WapperFunction<int(*)(), f1>::call();
WapperFunction<int(*)(int), f2>::call();
};
运行效果如:
Call result of 0X00441361 {int (__cdecl*)(void)} is 0 {int}
Enter the argument1{int}:23
Call result of 0X00441906 {int (__cdecl*)(int)} is 529 {int}
现在的问题是 WapperFunction<int(*)(int), f2>::call(); 的调用中第一个模板参数 int(*)(int) 是可以从第二个参数 f2 中推导出来的。但应该如何使用才能让它进行推导? 使调用方式为:
WapperFunction<f1>::call();
WapperFunction<f2>::call();
或者有办法在运行期来生成全局函数的话,这种调用方式也可以:
WapperFunction::call(f1);
WapperFunction::call(f2);
注意生成的必须要是全局函数,不能是函数对象(需要和 C API 交互)。
相关推荐
模板特化与函数模板参数推导的深入解析
本文深入探讨了C++模板编程中关于模板特化和函数模板参数推导的概念和技巧。通过分析模板特化的规则、函数模板参数的非推导性以及如何处理模板中的类型和参数,揭示了模板编程中一些常见的问题及其解决方法。...
C++模板的参数推导与特化技巧
本文深入探讨了C++模板在类和函数中参数推导的机制,非推导参数的处理方式,以及模板特化的规则和常见问题。详细解释了在特定情况下如何强制类型推导,以及如何通过模板特化来优化代码。文章还讨论了内部类模板的语法和特化时的注意事项。...
深入探讨C++模板参数推导的奥秘
本文通过C++模板示例探讨了模板参数推导问题。在函数fails(foo<T>, T)中,由于foo<T>构造函数的泛型性导致无法从12.0推导出T的类型,而works(std::type_identity_t<foo<T>>, T)通过type_identity_t创建非推导上下文,使T仅从第二个参数推导成功。这揭示了模板推导的精确性要求,并展示了使用std::type_identity控制推导过程的技巧,对编写可靠模板代码具有重要意义。
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
/ 自动推导为 int, const char*, double。// 推导为 MyContainer<const char*>// 推导为 std::pair<int, double>// 推导为 std::vector<int>// T = int (const被剥离)void func(T (&)[N]) {} // 保留数组类型信息。// T = int (引用被剥离)void func(T&& param) {} // 万能引用。// T = int& (左值引用)func(3.14);
产教融合实训基地与实践中心建设逻辑图-可编辑版
产教融合实训基地与实践中心建设逻辑图-可编辑版


