使用 C++14 的具有多个返回类型的 decltype(auto)
decltype(auto) with multiple returning types using C++14
我安装了 CTP-Nov2013-Compiler 以获得 familiar/experiment 的一些 C++14 特性(通过 doing/reading 学习)用于 VS 2013。
我在没有使用因错误而失败的通用方法的情况下尝试了类似于任何 POD 类型转换器的字符串(无法拼写正确的错误,因为今天我以某种方式 Visual Studio 在我尝试构建程序时崩溃 [CTP错误?]) 'return type is not of the first return type'.
问题举例:
#include <iostream>
using namespace std;
enum EType{
eInt,
eBool,
eFloat,
eString
}
class Test
{
Test();
virtual ~Test(){}
decltype(auto) SomeMethod(std::string texttoconvert, EType type)
{
switch(type)
{
//convert to the specific type by using the C++11 stoi* functions and return it (for the example I'm not checking for failure in the conversion)
case eInt: return std::stoi(texttoconvert);
break;
case eFloat: return std::stof(texttoconvert);
break;
...
default:
break;
}
}
int main()
{
Test hugo;
auto lAuto=hugo.SomeMethod("1.234", eFloat);
cout<<lAuto<<endl; //should return a float
return 0;
}
所以问题是,是逻辑类型的错误(除了不使用 try-catch-blocks 进行 std::sto*
转换)还是语法错误?
我遇到的另一个问题是,我必须在头文件中(否则会出错)而不是在 .cpp 文件中实现该方法,这是一个类似于模板函数的 wanted/necessary 功能吗?
这是语义错误。 auto
return 类型表示该方法已经自动推导出 return 类型,但该类型对于整个方法仍然是一个类型,它不能根据调用的 return
表达式而改变。此外,C++14 要求所有 return
表达式 return 具有相同的类型,并在这种情况下禁止隐式转换。
您需要将编译时信息作为模板参数传递。
并且类型确定信息必须是编译时信息。
enum EType{
eInt,
eBool,
eFloat,
eString
};
template<EType type>
decltype(auto) convert(std::string texttoconvert);
template<>
decltype(auto) convert<eInt>(std::string texttoconvert) {
return std::stoi(texttoconvert);
}
template<>
decltype(auto) convert<eFloat>(std::string texttoconvert) {
return std::stof(texttoconvert);
}
struct Test {
template<EType type>
decltype(auto) SomeMethod(std::string texttoconvert) {
return convert<type>(texttoconvert);
}
};
int main() {
Test t;
float f = t.SomeMethod<eFloat>("3.14");
std::cout << f << "\n";
}
我安装了 CTP-Nov2013-Compiler 以获得 familiar/experiment 的一些 C++14 特性(通过 doing/reading 学习)用于 VS 2013。 我在没有使用因错误而失败的通用方法的情况下尝试了类似于任何 POD 类型转换器的字符串(无法拼写正确的错误,因为今天我以某种方式 Visual Studio 在我尝试构建程序时崩溃 [CTP错误?]) 'return type is not of the first return type'.
问题举例:
#include <iostream>
using namespace std;
enum EType{
eInt,
eBool,
eFloat,
eString
}
class Test
{
Test();
virtual ~Test(){}
decltype(auto) SomeMethod(std::string texttoconvert, EType type)
{
switch(type)
{
//convert to the specific type by using the C++11 stoi* functions and return it (for the example I'm not checking for failure in the conversion)
case eInt: return std::stoi(texttoconvert);
break;
case eFloat: return std::stof(texttoconvert);
break;
...
default:
break;
}
}
int main()
{
Test hugo;
auto lAuto=hugo.SomeMethod("1.234", eFloat);
cout<<lAuto<<endl; //should return a float
return 0;
}
所以问题是,是逻辑类型的错误(除了不使用 try-catch-blocks 进行 std::sto*
转换)还是语法错误?
我遇到的另一个问题是,我必须在头文件中(否则会出错)而不是在 .cpp 文件中实现该方法,这是一个类似于模板函数的 wanted/necessary 功能吗?
这是语义错误。 auto
return 类型表示该方法已经自动推导出 return 类型,但该类型对于整个方法仍然是一个类型,它不能根据调用的 return
表达式而改变。此外,C++14 要求所有 return
表达式 return 具有相同的类型,并在这种情况下禁止隐式转换。
您需要将编译时信息作为模板参数传递。
并且类型确定信息必须是编译时信息。
enum EType{
eInt,
eBool,
eFloat,
eString
};
template<EType type>
decltype(auto) convert(std::string texttoconvert);
template<>
decltype(auto) convert<eInt>(std::string texttoconvert) {
return std::stoi(texttoconvert);
}
template<>
decltype(auto) convert<eFloat>(std::string texttoconvert) {
return std::stof(texttoconvert);
}
struct Test {
template<EType type>
decltype(auto) SomeMethod(std::string texttoconvert) {
return convert<type>(texttoconvert);
}
};
int main() {
Test t;
float f = t.SomeMethod<eFloat>("3.14");
std::cout << f << "\n";
}