我想创建一个模板函数,根据模板参数返回int
或std::vector<int>
。例如:
struct ReturnInt {};
struct ReturnVec {};
[...]
int num = func<ReturnInt>();
std::vector<int> nums = func<ReturnVec>();
基于我对TMP的非常有限的经验,我一直在天真地尝试实现这一点。我觉得它应该涉及明确的模板专业化,std::enable_if
,std::conditional
和/或SFINAE。但是我编写这个代码的尝试都不会编译,更不用说在一个简单的测试中运行了。
如何实现这种返回类型切换?
修改:正如评论中所述,这是对我实际问题的简化。如果它有帮助,我有一个接受模板参数的类。根据参数的不同,我希望它的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};
}
};