C++ 如何指定返回类的constexpr函数的类型(无需使用auto关键字)

C++ 如何指定返回类的constexpr函数的类型(无需使用auto关键字),c++,c++14,constexpr,clang++,g++4.9,C++,C++14,Constexpr,Clang++,G++4.9,基本上,在下面我想看看我是否可以绕过使用auto关键字 假设我们有以下代码[适用于g++4.9.2(Ubuntu 4.9.2-10ubuntu13)和clang版本3.6.0]: //g++ -std=c++14 test.cpp //test.cpp #include <iostream> using namespace std; template<typename T> constexpr auto create() { class test { publ

基本上,在下面我想看看我是否可以绕过使用
auto
关键字

假设我们有以下代码[适用于g++4.9.2(Ubuntu 4.9.2-10ubuntu13)和clang版本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;
}
//g++-std=c++14 test.cpp
//test.cpp
#包括
使用名称空间std;
模板
constexpr自动创建(){
课堂测试{
公众:
int i;
虚拟整数get(){
返回123;
}
}r;
返回r;
}
自动v=创建();
内部主(空){

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

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

但是,当
auto
工作时,我看不出这样做的理由。

您将类函数设置为本地函数,然后询问如何从函数外部访问它。即使您可以(在这种情况下,您也可以),这个问题不是一个感性的问题。如果你想让你的类从函数外部访问,你不应该让它成为函数本地的…@hvd:
如果你想让你的类从函数外部访问,它显然已经可以从函数外部访问了。考虑到我特别提到了这一点,我不明白为什么你觉得有必要提醒我,我已经清楚地意识到了这一点。那句话中的相关部分就是你引用的内容后面的部分:所以不要让它在本地运行。你在问题中没有给出任何理由为什么你想让它在本地运行,只是你想。@hvd
你在问题中没有给出任何理由为什么u希望保持它的本地功能,只想让你/代码>:基本上我正在尝试模仿标准的ML函数在C++中工作的方式。你可以通过模板参数来做很多事情的指定,但是最终你会有太多模板参数。我试图用<代码> CONTXPRPR < /C>函数来转换。将一个模板类转换为另一个模板类,这允许我减少生成的类所需的模板参数的数量functors@hvd:因此,我必须在
constepr
函数内定义类。如果我在
constepr
函数外定义模板函数,我必须指定额外的模板参数,这正是我试图避免的。非常感谢。我对
auto
很满意,但我只是想看看是否可以显式指定其类型。