【问题标题】:How to specify type of a constexpr function returning a class (without resorting to auto keyword)如何指定返回类的 constexpr 函数的类型(不使用 auto 关键字)
【发布时间】:2015-12-24 17:47:46
【问题描述】:

基本上在下面我想看看我是否可以避免使用auto关键字

假设我们有以下代码 [适用于 g++ 4.9.2 (Ubuntu 4.9.2-10ubuntu13) & clang version 3.6.0]:

//g++ -std=c++14 test.cpp
//test.cpp

#include <iostream>
using namespace std;

template<typename T>
constexpr auto create() {
  class test {
  public:
    int i;
    virtual int get(){
      return 123;
    }
  } r;
  return r;
}

auto v = create<int>();

int main(void){
  cout<<v.get()<<endl;
}

如何指定v 的类型而不是使用 auto 关键字在其声明/定义点?我试过create&lt;int&gt;::test v = create&lt;int&gt;();,但这不起作用。

附言

1)这与我在Returning a class from a constexpr function requires virtual keyword with g++ 提出的问题不同,即使代码相同

2)我确实想在函数之外定义类。

【问题讨论】:

  • 您将您的类设为函数本地,然后询问如何从函数外部访问它。即使你可以(在这种情况下你可以),这个问题也不是一个有意义的问题。如果您希望您的类可以从函数外部访问,则不应将其设为函数本地...
  • @hvd : If you want your class to be accessible from outside the function 它显然已经在函数外访问。
  • 鉴于我特意附上了一个注释,我不明白你为什么觉得有必要提醒我,我显然已经意识到这一点。该句子中的相关部分是您引用的部分:所以不要让它成为函数本地的。你没有在你的问题中给出任何理由为什么你想保持它是函数本地的,只有你想要的 那个
  • @hvd You don't give any reason in your question why you would want to keep it function-local, only that you want to :基本上我试图模仿标准 ml 仿函数在 c++ 中的工作方式。您可以通过模板参数指定所有内容,但最终您最终会拥有太多模板参数。我正在尝试使用constexpr 函数将一个模板类转换 到另一个模板类,这使我可以减少生成类所需的模板参数的数量。有关 SML 函子,请参阅 jozefg.bitbucket.org/posts/2015-01-08-modules.html
  • @hvd :因此我必须在constexpr 函数中定义类inside。如果我在 constexpr 函数之外定义模板函数,我将不得不指定额外的模板参数,这是我试图避免的。

标签: c++ c++14 constexpr clang++ g++4.9


【解决方案1】:

实际类型是隐藏的,因为它在函数内部是本地的,所以你不能显式地使用它。但是,您应该能够使用decltype,如

decltype(create<int>()) v = create<int>();

但是,当auto 起作用时,我看不到这样做的理由。

【讨论】:

  • 非常感谢。我对auto 很好,但我只是想看看我是否可以明确指定它的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2018-05-31
相关资源
最近更新 更多