根据其他模板参数指定返回类型

Sip*_*pka 5 c++ templates return-type function-templates

我想通过其他模板参数指定模板化函数的返回类型。所有这些都在一个班级中。

在头文件中:

class MyClass {
    template<int type, typename RT>
    RT myfunc();
};
Run Code Online (Sandbox Code Playgroud)

在 .cpp 中是这样的:

template<>
int MyClass::myfunc<1, int>() { return 2; }

template<>
double MyClass::myfunc<2, double>() { return 3.14; }

template<>
const char* MyClass::myfunc<3, const char*>() { return "some string"; }
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样使用我的功能:

MyClass m;
int i = m.myfunc<1>(); // i will be 2
double pi = m.myfunc<2>(); // pi will be 3.14
const char* str = m.myfunc<3>(); // str == "some string"
Run Code Online (Sandbox Code Playgroud)

所以我希望我的函数能够通过一个模板整数(或任何枚举)进行参数化,并且基于这个整数,返回类型会有所不同。我不希望该函数使用指定参数以外的任何其他整数参数,例如这里m.myfunc<4>()会产生编译错误。

我只想通过一个模板参数来参数化我的函数,因为它m.myfunc<1, int>()可以工作,但我不想一直写类型名。

我尝试使用自动返回类型或其他方式进行模板化,但总是遇到一些编译错误。(未找到功能,未解析的外部...)

这有可能吗?

Kei*_*ith 7

这就是你所寻求的吗?

template<int n>
struct Typer
{
};

template<>
struct Typer<1>
{
    typedef int Type;
};
template<>
struct Typer<2>
{
    typedef double Type;
};
template<>
struct Typer<3>
{
    typedef const char* Type;
};

class MyClass
{
public:
    template<int typeCode>
    typename Typer<typeCode>::Type myfunc();
};

template<> Typer<1>::Type MyClass::myfunc<1>(){ return 2; } 

template<> Typer<2>::Type MyClass::myfunc<2>() { return 3.14; }

template<> Typer<3>::Type MyClass::myfunc<3>() { return "some string"; }
Run Code Online (Sandbox Code Playgroud)