Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对不同类型使用具有不同返回的模板函数不会';行不通_C++_Templates_Return Type - Fatal编程技术网

C++ 对不同类型使用具有不同返回的模板函数不会';行不通

C++ 对不同类型使用具有不同返回的模板函数不会';行不通,c++,templates,return-type,C++,Templates,Return Type,所以我写了这样的东西: class MyClass { enum varType {INTEGER, DOUBLE, VECTOR}; int beautiful_integer; double awesome_double; std::vector<float> many_floats; template <class T> T getVariable(varType type) {

所以我写了这样的东西:

class MyClass
{
    enum varType {INTEGER, DOUBLE, VECTOR};

    int beautiful_integer;
    double awesome_double;
    std::vector<float> many_floats;

    template <class T>
      T getVariable(varType type)
      {
          if(type == INTEGER)
          {
             return beatiful_integer;
          }
          if(type == DOUBLE)
          {
             return awesome_double;
          }
          if(type == VECTOR)
          {
             return many_floats;
          }
      }

...

};

我想将
beautiful\u integer
的值分配给
一些在编译时确定的模板参数。您可以通过模板专门化来完成它。不要使用
enum
。e、 g

class MyClass
{
    int beautiful_integer;
    double awesome_double;
    std::vector<float> many_floats;

    template <class T>
    T getVariable();

    template<>
    int getVariable<int>
    {
        return beatiful_integer;
    }

    template<>
    double getVariable<double>
    {
        return awesome_double;
    }

    template<>
    std::vector<float> getVariable<std::vector<float>>
    {
        return many_floats;
    }

};
class-MyClass
{
整数;
双倍;
向量多个浮点数;
模板
T getVariable();
模板
int getVariable
{
返回美好的_整数;
}
模板
双getVariable
{
双倍回报;
}
模板
std::vector getVariable
{
返回多个浮点数;
}
};
在C++17中,您还可以使用

模板
T getVariable()
{
如果constexpr(std::is_same_v)
{
返回美好的_整数;
} 
否则,如果constexpr(std::is_same_v)
{
双倍回报;
} 
否则,如果constexpr(std::is_same_v)
{
返回多个浮点数;
} 
其他的
{
...
}
}
然后

MyClass一些_类;
int some_number=some_class.getVariable();

顺便说一句:
MyClass some_class()没有达到您期望的效果。参见。

作为备选方案,标准:

template <class T>
const T& getVariable() const
{
    return std::get<const T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}

template <class T>
T& getVariable()
{
    return std::get<T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}
模板
常量T&getVariable()常量
{
return std::get(std::tie(漂亮的整数,很棒的双精度,许多浮点数));
}
模板
T&getVariable()
{
return std::get(std::tie(漂亮的整数,很棒的双精度,许多浮点数));
}

非常感谢您!我想我没有完全理解如何使用这样的模板+你的解决方案解释得非常清楚;没有括号。通常我的编译器会提醒我;P但是令人烦恼的解析是一个有趣的问题,为什么函数不按值返回(就像OP的成员模板一样)@水飲み鳥: 我不喜欢按值返回
std::vector
。您仍然可以通过类似于
typename boost::call_traits::param_type
的方法来改进它,而不是在返回类型中使用
const T&
。感谢您的解释。
template <class T>
T getVariable()
{
    if constexpr (std::is_same_v<T, int>)
    {
        return beatiful_integer;
    } 
    else if constexpr (std::is_same_v<T, double>)
    {
        return awesome_double;
    } 
    else if constexpr (std::is_same_v<T, std::vector<float>>)
    {
        return many_floats;
    } 
    else
    {
        ...
    }
}
MyClass some_class;
int some_number = some_class.getVariable<int>();
template <class T>
const T& getVariable() const
{
    return std::get<const T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}

template <class T>
T& getVariable()
{
    return std::get<T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}