【问题标题】:Address of "empty" variadic template specialization“空”可变参数模板特化的地址
【发布时间】:2012-09-03 14:01:40
【问题描述】:

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

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 有效)和更明确的方式:

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

通过显式方式,GCC 4.7.1 说:

error: insufficient contextual information to determine type

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

【问题讨论】:

  • 您能否发布更多代码,例如AlgorithmFactory 的定义以及您获取地址的上下文?
  • AlgorithmFactory 是一个没有父类的类; Createalgorithm 定义为:template VAlgorithm* CreateAlgorithm(const char *objectName, const char *className, Params ... par)。我正在尝试从主函数内部获取地址。
  • 你已经声明了CreateAlgorithm static,对吧?
  • 不,我没有。我可以这样做,因为 AlgorithmFactory 是一个单身人士。但是,如果我指定至少一种类型,为什么它在没有静态的情况下工作,而如果我将类型列表留空,它需要静态?
  • 这是未定义的行为;您不能将指向成员函数的指针转换为函数指针(static 成员函数不是成员函数)。

标签: c++ templates c++11 variadic-templates


【解决方案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;
}

【讨论】:

  • 正是 foo 声明中的 static 关键字使一切顺利编译。我编译了您的示例,并且确实可以正常工作,但是如果您省略 static,那么您会收到有关上下文信息不足的相同错误。
  • @NicolaMori 容易犯错误!
猜你喜欢
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多