4

我有一个可变参数模板成员函数定义为:

template<typename ... Params>
 VAlgorithm* CreateAlgorithm(const char *objectName, const char *className, Params ... par)

我想获取 Params 不包含类型的专用版本的地址(我称之为“空”专业化),即:

VAlgorithm* CreateAlgorithm(const char *objectName, const char *className)

我尝试了几种方法。天真的方式:

&AlgorithmFactory::CreateAlgorithm<>

(例如,因为 &AlgorithmFactory::CreateAlgorithm< int > 有效)和更明确的方式:

(VAlgorithm* (*)(const char*, const char*))AlgorithmFactory::CreateAlgorithm<>

通过明确的方式,GCC 4.7.1 说:

error: insufficient contextual information to determine type

编译器似乎不理解“空”特化,它将缺少的模板类型解释为缺少信息而不是“无类型”信息。这样做的正确方法是什么?(很抱歉这个可能很幼稚的问题,但我对可变参数模板还很陌生,我没有找到关于这个主题的文档)。谢谢

4

1 回答 1

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;
}
于 2012-09-03T14:32:57.183 回答