Составьте доступ к элементам данных в C ++ - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь получить доступ к элементам данных, перебирая объекты с помощью указателей на элементы данных.

Идея состоит в том, чтобы иметь функцию шаблона с переменным числом аргументов, которая вызывает std :: invoke для первого объекта obj и передает результат вследующий указатель на элемент данных.Что-то вроде

compose x fnList = foldl obj (\x f -> f x) fnList

из функционального мира.

Что-то, что я получил по пути:

// main.hpp
#include <iostream>
#include <functional>
// initial template to stop recursion
template<typename T>
T getMember(T obj) {
  return obj;
}
// variadic template, where recursive application of 
// pointer to data member should happen
// I think return type should be something like "*Ret"
template<typename T, typename K, typename Ret, typename ... Args>
Ret getMember(T obj, K memberPointer, Args ... args) {
    return getMember(std::invoke(memberPointer, obj), args ...);
}

и

//main.cpp
#include <iostream>
#include "main.hpp"

//inner class
class Engine 
{
    public:
    std::string name;
};
// outer class
class Car
{
    public:
    int speed;
    Engine eng;
};

void main()
{
    Car car;
    car.speed = 1;        
    car.eng.name = "Some Engine Name";

    // should be same as call to id function, returning the only argument
    Car id = getMember(c1);
    // should "apply" pointer to data member to the object and
    // return speed of the car
    int speedOfCar = getMember(car, &Car::speed);
    // should "apply" pointer to data member to the car,
    // pass the resulting Engine further to &Engine::name,
    // return "Some Engine Name"
    std::string nameOfEngineOfCar = getMember(car, &Car::eng, &Engine::name);

    std::cout << nameOfEngineOfCar << std::endl;
}

Компиляцияне может вывести тип возврата Ret (gcc 5+, C ++ 17) Возможно ли это?Каковы ограничения (это может быть сделано в C ++ 14)?

1 Ответ

0 голосов
/ 20 ноября 2018

Вы не можете вывести аргумент шаблона, который появляется только в позиции типа возвращаемой функции.Но вывод аргументов шаблона - не единственный вид вывода в C ++.Вы можете сделать это:

template <class Bar, class Baz>
auto foo(Bar x, Baz y) 
      -> decltype(auto) { 
    return moo(x, y); 
}

Если это не удастся из-за старого компилятора, более безопасным вариантом является

template <class Bar, class Baz>
auto foo(Bar x, Baz y)
     -> decltype(moo(x, y)) { 
    return moo(x, y); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...