我有一个模板化的结构,然后我专门研究如下:
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 ++的理解。
答案 0 :(得分:1)
现在我的问题是:如果没有,我可以做我做过的事情 第一个结构FunctionSignature?
不,这是不可能的。
为了使用部分类模板专业化,您需要拥有一个专门的主类模板。
语法:
模板&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;