Специализация типа оберткиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Специализация типа обертки

Сообщение Anonymous »

У меня есть шаблон функции C ++: < /p>
#include

template
T get_gadget(std::string_view str);
< /code>
Я также добавил явные специализации для некоторых пользовательских типов, например, гаджетов и гаджетов: < /pbr /> template
GadgetA get_gadget(std::string_view str) {
// implementation
}

template
GadgetB get_gadget(std::string_view str) {
// implementation
}
< /code>
Теперь я хочу заставить его работать на тип обертки, как это: < /p>
template
Wrapper get_gadget(std::string_view str) {
auto underlying = get_gadget(str);
// implementation
}
< /code>
Однако, когда я компилируюсь, я получаю неоднозначную ошибку вызова. Я думаю, что это происходит потому, что компилятор не может различать первичный шаблон и специализацию обертки.#include
#include

// Primary template (only declared)
template
T get_gadget(std::string_view str);

// --- Some user-defined types ---
struct GadgetA {
std::string name;
};
struct GadgetB {
int value;
};

// --- Explicit specializations ---
template
GadgetA get_gadget(std::string_view str) {
return GadgetA{std::string(str)};
}

template
GadgetB get_gadget(std::string_view str) {
return GadgetB{static_cast(str.size())};
}

// --- A generic Wrapper ---
template
struct Wrapper {
T inner;
};

// --- Generic overload for Wrapper ---
template
Wrapper get_gadget(std::string_view str) {
auto underlying = get_gadget(str); // delegate
return Wrapper{underlying};
}

// --- Demo ---
int main() {
auto a = get_gadget("HelloA");
auto b = get_gadget("HelloB");
auto wa = get_gadget("WrappedA");

std::cout

Подробнее здесь: https://stackoverflow.com/questions/797 ... ialization
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»