模板特化和函数指针

时间:2018-01-05 19:26:16

标签: c++

我有一个模板化的结构,然后我专门研究如下:

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 ++的理解。

2 个答案:

答案 0 :(得分:1)

  

现在我的问题是:如果没有,我可以做我做过的事情   第一个结构FunctionSignature?

不,这是不可能的。

为了使用部分类模板专业化,您需要拥有一个专门的主类模板。

来自partial specialization

  

语法:

     

模板&lt;参数列表&gt; class-key class-head-name&lt;参数-列表&gt;声明

     

其中class-head-name标识先前声明的的名称   班级模板。

答案 1 :(得分:1)

该模板无效。它有一个类型,一个带有返回类型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;