【问题标题】:How to typedef template function pointer?如何typedef模板函数指针?
【发布时间】:2018-10-28 10:46:11
【问题描述】:

我想键入一个指向模板函数的函数指针

class A
{
    template <typename T>
    typedef void (*FPTR)<T>();
}

我尝试过这种方式,但没有成功。对这件事有什么想法吗?

【问题讨论】:

  • 你能举例说明你想如何使用所说的 typedef 吗?
  • 如果模板函数的参数类型和返回类型都不依赖于模板参数,那么您可以使用常规函数指针(typedef void (*FPTR)();,甚至更好:using FPTR = void (*)();)。但该指针只能指向函数的特定实例化(例如FPTR ptr = foo&lt;int&gt;;)。不可能使函数指针指向函数模板本身,而不是 if 它的实例之一。
  • @HolyBlackCat 假设我写下了using FPTR = void (*)();。我可以将我的 FPTR 引用到 foo 函数的任何初始化吗?假设我的函数对每种 int 类型都有不同的实现,比如foo&lt;int8&gt;() {...}foo&lt;int16&gt;() {...}foo&lt;int32&gt;() {...}。我可以将我的指针指向这些函数实现吗?
  • 如我所说,如果模板函数的参数类型和返回类型都不依赖于模板参数,那么您可以使用函数指针。从您的评论中不清楚是否是这种情况。
  • 好的,谢谢。是的。没有返回类型或参数取决于模板参数。

标签: c++ c++11 templates function-pointers typedef


【解决方案1】:

正如@HolyBlackCat 所指出的,正常的函数指针应该像你有一个简单的模板化 void 函数一样工作,它的模板参数不会同时作用于返回和参数类型。

template <typename T>
void someVoidFunction() {}

using fPtrType = void(*)();

int main()
{
    fPtrType funPtr1 = &someVoidFunction<int>;
    fPtrType funPtr2 = &someVoidFunction<float>;
    fPtrType funPtr3 = &someVoidFunction<std::string>;
    return 0;
}

如果是这种情况,那么模板参数取决于函数 arg 和返回类型,您也应该为每种类型实例化函数指针。

template <typename T, typename U>
T someFunction(U u) {}

template <typename T, typename U>
using fPtrType = T(*)(U);

int main()
{
    fPtrType<int, float> funPtr1 = &someFunction<int, float>;  // instance 1
    fPtrType<float, float> funPtr2 = &someFunction<float, float>; // instance 2
    return 0;
}

【讨论】:

    【解决方案2】:

    模板函数产生函数。模板类产生类。模板变量产生变量。

    指针可以指向函数或变量。它们不能指向模板;模板没有地址。

    Typedef 定义变量的类型。

    模板变量指针可以共同指向模板函数的各种实例,但初始绑定将在编译时完成,并且一次只能指向其他地方一个变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-12
      • 2016-01-07
      • 2019-08-24
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多