我有一个可变参数模板成员函数,定义为:
template<typename ... Params>
VAlgorithm* CreateAlgorithm(const char *objectName, const char *className, Params ... par)
我想获取专业版的地址,其中Params不包含任何类型(我称之为“空”专业化),即:,
VAlgorithm* CreateAlgorithm(const char *objectName, const char *className)
我试过几种方式。天真的方式:
&AlgorithmFactory::CreateAlgorithm<>
(例如,&amp; AlgorithmFactory :: CreateAlgorithm&lt; int&gt;工作)以及更明确的方式:
(VAlgorithm* (*)(const char*, const char*))AlgorithmFactory::CreateAlgorithm<>
GCC 4.7.1以明确的方式说:
error: insufficient contextual information to determine type
似乎编译器不理解“空”专门化,它将缺少的模板类型解释为缺少信息而不是“无类型”信息。这样做的正确方法是什么? (很抱歉这个潜在的天真问题,但我对可变参数模板很新,我没有找到关于这个主题的文档)。 感谢
答案 0 :(得分:1)
你的代码应该有用;见例如http://liveworkspace.org/code/6253cf45f416be60879b93aa74c24de8
以下所有语法都适用于我:
struct S {
template<typename... Args> static int *foo(const char *, const char *, Args...);
};
int main() {
(int *(*)(const char *, const char *))S::foo<>;
(int *(*)(const char *, const char *))S::foo;
(int *(&)(const char *, const char *))S::foo<>;
(int *(&)(const char *, const char *))S::foo;
int *(&f)(const char *, const char *) = S::foo<>;
int *(&g)(const char *, const char *) = S::foo;
int *(*h)(const char *, const char *) = S::foo<>;
int *(*i)(const char *, const char *) = S::foo;
}