如何根据模板参数返回不同的类型

时间:2012-09-17 02:59:05

标签: c++ visual-studio-2010 templates visual-c++ template-meta-programming

我想创建一个模板函数,根据模板参数返回intstd::vector<int>。例如:

struct ReturnInt {};
struct ReturnVec {};

[...]

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

基于我对TMP的非常有限的经验,我一直在天真地尝试实现这一点。我觉得它应该涉及明确的模板专业化,std::enable_ifstd::conditional和/或SFINAE。但是我编写这个代码的尝试都不会编译,更不用说在一个简单的测试中运行了。

如何实现这种返回类型切换?

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

1 个答案:

答案 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};
    }
};