Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
DimonGoblin
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 2
#1

Шаблоны и ссылки. Promise<T>, Future<T>

01.10.2017, 18:02. Просмотров 247. Ответов 2

Дали задание написать Promise<T> и Future<T>. Сделал у обоих shared_ptr на структуру, в которой лежат общие для них данные. Написал, все работает нормально, но возникают проблемы, когда в качестве аргумента шаблона дать ссылку, например Promise<int &>. Получается, что Value(устанавливаемое set) является ссылкой, которая ни на что не ссылается и возникает ошибка при компиляции. Кроме того появляются проблемы с set (в общем все плохо =)). Возможно ли как-то отловить подобные случаи, или сделать так, что бы всегда работало?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Promise.h
 
template <typename T>
struct sharedVariables {
    T value;
    std::condition_variable check;
    bool valid;
};
 
template <typename T>
class Promise {
public:
    Promise();
    Promise(const Promise<T>&) = delete;
    Promise(Promise<T>&&) = default;
    void set(const T &);
    void set(T&&);
    Future<T> getFuture();
private:
    std::shared_ptr<sharedVariables<T> > attributes;
    bool isAdd = false;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Future.h
 
template<typename T>
class Promise;
 
template<typename T>
struct sharedVariables;
 
template <typename T>
class Future {
public:
    Future(const Future<T>&) = delete;
    Future(Future<T>&&) = default;
    const T & get();
    void wait();
    bool isReady() const;
    friend Future<T> Promise<T>::getFuture();
private:
    Future() {};
    std::shared_ptr<sharedVariables<T> > attributes;
};
C++
1
2
3
4
5
6
7
//main
 
void main() {
    int b = 5;
    Promise<int &> pr;
    system("pause");
}
Ошибки: 1) void Promise<int &>::set(T): функция-член уже определена или объявлена
2) sharedVariables<T>::value: ссылки должны быть инициализированы

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2017, 18:02
Ответы с готовыми решениями:

Построение архитектуры асинхронного кода через future/promise
Всем привет Недавно размышлял над двумя путями реализации асинхронного кода :...

Std::promise::set_exception
Пример с Хабра (вот из этой статьи): #include &lt;iostream&gt; #include &lt;thread&gt;...

C++ 11 многопоточность Future и promise
Всем Привет!!! Пытаюсь разобраться уже несколько дней, пока не получается, не...

I am doing for the future
Объясните, по каком правилу тут используется I'm not healing, а не I won't...

Выход из Promise
Всем привет! Есть такая конструкция: function ajax_api(method, date) {...

2
Valeryn
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 264
05.10.2017, 21:51 #2
C++
1
static_assert(std::is_arithmetic<T>::value || std::is_class<T>::value, "ERROR! T is not class or type");
Ну можно такую проверку сделать.
А зачем в шаблон передавать ссылку то вообще?

Добавлено через 2 минуты
или !std::is_reference, что бы в шаблон ссылку не воткнул никто.
Или если воткнул, но в set и других функциях выполнять проверку, является ли T - ссылкой
0
MrGluck
Модератор
Эксперт CЭксперт С++
8054 / 4898 / 1426
Регистрация: 29.11.2010
Сообщений: 13,296
06.10.2017, 12:10 #3
C++17 (можно переписать на С++11, развернув _t и _v)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <type_traits>
 
template <typename T, typename = std::enable_if_t<!std::is_reference_v<T>>>
struct Foo
{
    T val;
};
 
int main()
{
    Foo<int>();   // OK
    Foo<int &>(); // Error
}
http://coliru.stacked-crooked.com/a/5e23beb228ac0ea2
Как альтернатива - пихать static_assert с тем же std::is_reference
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2017, 12:10

Node.js и promise
Ребят, что-то никак не могу въехать в промисы... Нужно, чтобы функции...

Promise в Node
При выборке данных из базы использую Промис вот как это выглядит class...

Cry Me A Future
здравствуйте! &quot;cry me a river&quot; я нашёл как переводить а вот cry me a future...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru