gpt4 book ai didi

c++ - 模板 : Determine template arguments by function prototype

转载 作者:行者123 更新时间:2023-11-30 04:01:51 26 4
gpt4 key购买 nike

我有函数指针类型或函数原型(prototype):

int function (int arg);
typedef int (*function_t) (int arg);

和模板类一样

template <typename T_ret, typename... T_args> 
class caller {
T_ret (*m_p) (T_args... args);
public:
T_ret call (T_args... args) {
return m_p(args);
}
caller (T_ret (*p)(T_args...args)) : m_p(p) {}
};

是否可以让编译器自动确定代码中的模板参数,例如

class caller2 : public caller <__something_with_function_prototype__> {
caller2 : caller (function) {};
};

类似的问题:是否可以使用另一个模板类而不是函数来做到这一点?

template <typename T_ret, typename... T_args> class example;
typedef example<int, int> example_t;

谢谢。

最佳答案

不确定这是否是您想要的,但也许:

#include <iostream>

int function (int arg) { return arg; }
typedef int (*function_t) (int arg);

template <typename T_ret, typename... T_args>
class caller {
T_ret (*m_p) (T_args... args);
public:
T_ret call (T_args... args) {
return m_p(args...);
}
caller (T_ret (*p)(T_args...args)) : m_p(p) {}
};

template <typename T_ret, typename... T_args>
caller<T_ret, T_args...> get_caller(T_ret(*prototype)(T_args...))
{
return caller<T_ret, T_args...>(prototype);
}

int main()
{
function_t f = &function;
auto c = get_caller(f);
std::cout << c.call(1) << std::endl;
return 0;
}

Live demo link.

或者可能:

#include <iostream>

int function (int arg) { return arg; }
typedef int (*function_t) (int arg);

template <typename T>
class caller {};

template <typename T_ret, typename... T_args>
class caller<T_ret(*)(T_args...)> {
T_ret (*m_p) (T_args... args);
public:
T_ret call (T_args... args) {
return m_p(args...);
}
caller (T_ret (*p)(T_args...args)) : m_p(p) {}
};

int main()
{
caller<decltype(&function)> c(&function);
std::cout << c.call(1) << std::endl;
return 0;
}

Yet another live demo link.

关于c++ - 模板 : Determine template arguments by function prototype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25526548/

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