2016-01-11 5 views
0

Мне было интересно, можно ли передать функции вариационному шаблону, чтобы иметь какую-то логику для включения или отключения определенных параметров. Позвольте мне объяснить лучше. У меня есть система Entity-Component-System на C++ 11 с вариативными шаблонами, где объекты являются простыми идентификаторами, компоненты - это данные и/или малые логические функции, и вся логика происходит внутри систем. Системы получить необходимые объекты, которые ищут с помощью VARIADIC шаблона объектов, которые имеют перечень конкретных компонентов (я не используют идентификаторы для проверки компонентов), что-то вроде:Оценка шаблона Variadic

var entities = m_world.get<position, direction, acceleration>(); 

Но мне было интересно, если его можно сделать примерно так:

var entities = m_world.get<position, direction, acceleration, Except<rotation, whatever>>(); 

Для фильтрации объектов, имеющих определенный компонент.

Код для моего ECS свободно доступна здесь: https://github.com/arajar/ecs

Спасибо.

+0

1. m_world.get <положение, направление, ускорение>() равно к <...> функции m_world.search() в коде ECS? С вашей второй строкой вы хотите найти все объекты, которые имеют положение, направление и ускорение, но не имеют поворота атрибутов и что ли? – Gene

+0

да, именно это. – Araj

+0

Вы пытались реализовать функцию m_world.search_not <...>()? который работает аналогично поиску <...>(), но находит все исключающие сущности с заданными параметрами шаблона. – Gene

ответ

0

Возможно, это возможно. За архив Search<Include<int, float>, Exclude<std::string, double>>::search();. Вы могли бы написать следующий код:

#include <tuple> 
#include <typeinfo> 
#include <iostream> 

template<typename ...Args> 
class Search; 

template<> 
class Search<std::tuple<>, std::tuple<>> { 
public: 
    static void search() { 
    } 
}; 

template<typename T, typename ...Include, typename ...Exclude> 
class Search<std::tuple<T, Include...>, std::tuple<Exclude...>> { 
public: 
    static void search() { 
     std::cout << "include: " << typeid(T).name() << std::endl; 
     Search<std::tuple<Include...>, std::tuple<Exclude...>>::search(); 
    } 
}; 

template<typename T, typename ...Exclude> 
class Search<std::tuple<>, std::tuple<T, Exclude...>> { 
public: 
    static void search() { 
     std::cout << "exclude: " << typeid(T).name() << std::endl; 
     Search<std::tuple<>, std::tuple<Exclude...>>::search(); 
    } 
}; 

template<typename ...Args> 
using Include = std::tuple<Args...>; 

template<typename ...Args> 
using Exclude = std::tuple<Args...>; 

int main() { 
    Search<Include<int, float>, Exclude<std::string, double>>::search(); 
} 
+0

Большое спасибо, это было именно то, что я искал! – Araj

Смежные вопросы