Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
DimonGoblin
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 2
#1

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

01.10.2017, 18:02. Просмотров 181. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны и ссылки. Promise<T>, Future<T> (C++):

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

Future::wait_for не работает - C++
скопировал пример с cplusplus.com запускается. из while не выходит. компилятор gcc. среда - qt creator, хотя это врят ли важно. //...

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис) - C++
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем, корни у которых одни, решил создать эту...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны - C++
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов массива, равных 0; 2) сумму элементов...

std::async std::future и функции-члены - C++
как в async передать функцию-член нужного мне обьекта класса? С простыми функциями получилось, а вот тут засада. Заранее спасибо за...

2
Valeryn
70 / 43 / 8
Регистрация: 17.05.2015
Сообщений: 238
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Эксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
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
Привет! Вот еще темы с ответами:

Зачем нужны rvalue ссылки, если есть универсальные ссылки - C++
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...

Apply_visitor и std::future - Boost C++
Есть такой надуманный код. Я не могу понять почему не работает apply_visitor к объекту std::future который имеет возвращаемый тип...

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

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


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

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

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