Как вернуть другой тип на основе параметра шаблона

Я хотел бы создать функцию шаблона, которая возвращает либо 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

Решение

Основываясь на ваших изменениях, вы просто хотите получить стандартную специализацию шаблона.

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};
}
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]