LINUX.ORG.RU

Как сделать шаблонную функцию, что бы она приводила свои параметры к шаблону с параметрами-указателями?

 ,


0

1

Суть вопроса, есть некая шаблонная функция my_set(dest, src), и хочу что бы она выполнялась как при передачи параметров по указателю, так и при непосредственном указании. Нужно что бы при любом указании все сводилось к выполнению с указателями на значения. Именно с указателями, т.к. там у меня еще работа с packed полями, а они капризничают при передачи по амперсанду.

template <class D, class S>
void my_set(D& dest, const S& src) {
    my_set(&dest, &src);
}

template <class D, class S>
void my_set(D* dest, const S& src) {
    my_set(dest, &src);
}

template <class D, class S>
void my_set(D& dest, const S* src) {
    my_set(&dest, src);
}

template <class D, class S>
void my_set(D* dest, const S* src) {
// все должно свестись к этому выполнению.
    *dest = (D)*src;
}

Тут я написал вроде верно, но оно все лезут разные ошибки. В частности эта реализация не выполниться на этом примере:

    int sz1 = 1;
    short sz2;
    my_set(sz2, &sz1);

Ну так перенеси

template <class D, class S>
void my_set(D* dest, const S* src) {

в начало, а не в конец.

BceM_IIpuBeT ★★☆☆☆
()

Как насчёт вот так вот:

template <class D, class S>
enable_if_t<is_pointer_v<D> && is_pointer_v<S>>
my_set(D dest, const S src) {
    // все должно свестись к этому выполнению.
    *dest = *(D)src;
}

template <class D, class S>
enable_if_t<!is_pointer_v<D> && is_pointer_v<S>>
my_set(D dest, const S src) {
    my_set(&dest, src);
}

template <class D, class S>
enable_if_t<is_pointer_v<D> && !is_pointer_v<S>>
my_set(D dest, const S src) {
    my_set(dest, &src);
}

template <class D, class S>
enable_if_t<!is_pointer_v<D> && !is_pointer_v<S>>
my_set(D dest, const S src) {
    my_set(&dest, &src);
}

Laz ★★★★★
()
template <class T> auto& deref(T& x) { return x; }
template <class T> auto& deref(T* x) { return deref(*x); }
template <class T, class U>
void myset(T& dest, const U& src)
{
    deref(dest) = deref(src);
}
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.