模板专用化和函数指针

Template specialization and function pointer

本文关键字:函数 指针 专用      更新时间:2023-10-16

我有一个模板化的结构,然后我像下面这样专门化它:

template <class T>
struct FunctionSignature;
template <class Return, class Arg0>
struct FunctionSignature<Return (Arg0)>
{
    typedef Return(*type)(Arg0);
};

所以我像这样举例:

FunctionSignature<int (const std::string& str)>::type f = &onefunction;

函数 onefunction 具有以下签名: int onefunction(const std::string &str)所以这个编译很好。现在我的问题是:没有第一个结构FunctionSignature,我能做我所做的事情吗?我试过这个,但它没有编译:

template<class R (class U)>
struct A
{
  typedef R(*type)(U);
};

实例:

A<int (const std::string &)>::type f = &onefunction;

我在 c++03 中这样做是为了加深我对 c++ 的理解。

现在我的问题是:是否有可能做我所做的事情,没有 第一个结构函数签名?

不,这是不可能的。

为了利用部分类模板专用化,您需要有一个要专攻的主类模板。

从部分专业化:

语法:

模板<参数列表>类键类头名<参数列表>声明

其中类头名标识先前声明的名称 类模板。

该模板无效。它有一个类型,一个返回类型 R 的匿名、非类型函数指针,并接受类型 U 的参数。但是,这些类型是不明确的,因此每当编译器尝试复制代码时,它都会失败。您可以通过两种方式解决此问题。

template<class R, class U>
struct A {
  typedef R(*type)(U);
};
A<int, const std::string&>::type f = &onefunction;

或者,如果您想要非类型参数

template<class R, class U, R(*type)(U)>
struct A {
     R g(U arg) {return type(arg);}
};
A<int, const std::string&, &onefunction> f;