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

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

01.10.2017, 18:02. Показов 755. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2017, 18:02
Ответы с готовыми решениями:

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

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

Promise, два ajax запроса, задать очередь выполнения запросов, цепочка promise
Добрый день, уважаемые форумчане! Помогите разобраться с цепочкой promise. Суть проблемы: Есть...

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

2
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
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
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.... b228ac0ea2
Как альтернатива - пихать static_assert с тем же std::is_reference
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2017, 12:10

Хранить шаблоны документов в базе и выводить данные в эти шаблоны
Доброго времени суток. Интересует вопрос: мне необходимо формировать вордовские документы по...

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

Чем отличаются шаблоны HTML и шаблоны WordPress
В чём различие между шаблонами HTML и WordPress. Кроме того, что создаются они разными способами....

ExecutorService, ArrayList<Future<>>
Такой вот код, получаю nullPointException на строчке FutureCount.add(pool.submit(new...


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

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

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