Я хотел бы создать функцию шаблона, которая возвращает либо 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()
метод для возврата либо отдельного объекта / значения, либо стандартного контейнера объектов / значений.
Основываясь на ваших изменениях, вы просто хотите получить стандартную специализацию шаблона.
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};
}
};
Других решений пока нет …