0

我想创建一个模板函数,该函数返回intstd::vector<int>,具体取决于模板参数。例如:如何根据模板参数返回不同类型

struct ReturnInt {}; 
struct ReturnVec {}; 

[...] 

int num = func<ReturnInt>(); 
std::vector<int> nums = func<ReturnVec>(); 

我一直试图天真地实施这个基础上,我的经验非常有限的TMP。我觉得它应该包含一些沿着显式模板专业化,std::enable_ifstd::conditional和/或SFINAE的行。但是我的编码尝试都不会编译,更不用说在简单的测试中运行了。

这种返回式切换如何实现?

编辑:正如在评论中指出的,这是我的实际问题的简化。如果有帮助,我有一个接受模板参数的类。根据参数,我希望它的get()方法返回单个对象/值或对象/值的标准容器。

+3

为什么功能需要被命名为相同的,如果他们不义性的基于参数之类的东西?将模板专业化视为名称的一部分似乎没有必要。 –

+0

这是我的实际问题的简化。如果有帮助,我有一个接受模板参数的类。根据参数,我希望它的'get()'方法返回单个对象/值或标准的对象/值容器。 –

+0

你看过模板专业吗? –

回答

2

根据您的编辑,你只想要一个沼泽标准模板特

struct ReturnsInt{}; 
struct ReturnsVec{}; 

template<typename T> 
class Foo {}; 

template<> 
class Foo<ReturnsInt> { 
public: 
    int get() { return 3; } 
}; 

template<> 
class Foo<ReturnsVec> { 
public: 
    std::vector<int> get() { 
     return {3}; 
    } 
}; 

如果你只希望修改一个成员函数基于模板,但重用类定义的其余部分,你可以使用一个辅助类

struct ReturnsInt{}; 
struct ReturnsVec{}; 

class helper_Foo { 
public: 
    string bar() { 
     return "this is a shared method"; 
    } 
}; 

template<typename T> 
class Foo : public helper_Foo {}; 

template<> 
class Foo<ReturnsInt> : public helper_Foo { 
public: 
    int get() { return 3; } 
}; 

template<> 
class Foo<ReturnsVec> : public helper_Foo { 
public: 
    std::vector<int> get() { 
     return {3}; 
    } 
}; 
+0

这工作很好,但这种技术似乎很麻烦,当我有更多的'Foo'单一'get'方法。我无法分享课堂专业化的方法。 –

+1

@BretKuhns:将你的实际类实现放入一个助手类中,并从该助手类派生你的模板类。然后,您可以在模板类中定义'get()'成员函数,并让其他所有内容来自父类助手类。 –

+0

聪明!这是完美的。谢谢你的帮助! –

相关问题