0

我想创建一个模板函数,它返回intstd::vector<int>取决于模板参数。例如:

struct ReturnInt {};
struct ReturnVec {};

[...]

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

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

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

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

4

1 回答 1

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};
    }
};
于 2012-09-17T03:07:37.567 回答