Бюджет: 1000 UAH Термін: 1 день
Добрий день. Зможу зробити поставлену задачу швидко і якісно.
Програма пройде всі тести
Реалізуйте в C++17 шаблон функції inject, яка, отримавши два об’єкти (можливо, різних класів) S і T, що реалізують спільний інтерфейс I, виконає таку маніпуляцію таблицею віртуальних методів (vtable) об’єкта-цілі, щоб виклики методів інтерфейсу для цього об’єкта здійснювалися через об’єкт, переданий як джерело.
Як розв’язок надішліть один заголовковий файл (із розширенням .h). Ось його шаблон:
#ifndef INJECT_H_INCLUDED
#define INJECT_H_INCLUDED
#include <cstddef>
#include <type_traits>
template <class I, class S, class T,
typename std::enable_if< // enable this template only if:
std::is_polymorphic<I>::value && // - I has a vtable
std::is_base_of<I,S>::value && // - S implements I
std::is_base_of<I,T>::value, // - T implements I
int>::type = 0>
void inject(S & source, T & target)
{
// injects the implementation of interface I from source to target,
// so that calling the methods of I on target will result in them
// being called on source
typedef ptrdiff_t * vtable;
}
#endif
Можна припустити, що:
код буде компілюватися компілятором g++ з ABI, сумісним з версією 4.7;
I — це клас, який має лише віртуальні методи (без жодних полів);
I не є абстрактним і має публічний конструктор за замовчуванням;
класи S і T є фактичними (реальними) класами об’єктів source і target;
класи S і T віртуально (можливо, опосередковано) успадковують від I;
підоб’єкт класу I не є строгим префіксом жодного підоб’єкта об’єктів класів S ані T;
vtable (таблиця віртуальних методів) класу I не є строгим префіксом vtable жодного підоб’єкта об’єктів класів S ані T.
Для попередніх тестів свого розв’язку ви можете скористатися такою програмою мовою C++17:
#include <iostream>
#include "inject.h"
using namespace std;
struct F
{
virtual void f() { }
};
void callf(F & f)
{
f.f();
}
struct Dummy
{
virtual void dummy() { }
};
struct A : Dummy, virtual F
{
virtual void f() { cout << "A::f()" << endl; }
};
struct B : Dummy, virtual F
{
virtual void f() { cout << "B::f()" << endl; }
};
A a;
B b;
int main()
{
callf(a);
callf(b);
inject<F>(a, b);
callf(a);
callf(b);
return 0;
}Результатом наведеної вище програми має бути:
A::f() B::f() A::f() A::f()
Бюджет: 1000 UAH Термін: 1 день
Добрий день. Зможу зробити поставлену задачу швидко і якісно.
Програма пройде всі тести
Бюджет: 700 UAH Термін: 1 день
Добрий вечір!!! Можу зробити якісно!!!!!!!! Звертайтесь!!!!!!!!!!!!
Доброго дня! в якому середовищі потрібно виконати ваше завдання? Гадаю Visual Studio 2022 тут не підійде, так як там інший ABI