Как сохранить параметры шаблона в чем-то вроде структуры?

у меня есть код моделирования, где я хочу сделать некоторую конфигурацию во время компиляции: например, мне нужно определить измерение, тип данных и класс, содержащий операции низкого уровня (время компиляции для вставки).

что-то типа:

template <int DIMENSION, class DATATYPE, class OPERATIONS>
class Simulation{ ... }

template <int DIMENSION, class DATATYPE, class OPERATIONS>
class SimulationNode{ ... }

template <int DIMENSION, class DATATYPE, class OPERATIONS>
class SimulationDataBuffer{ ... }

во-первых, очень раздражает писать весь набор параметров для каждого класса. Во-вторых, что еще хуже, может быть, нужно ввести дополнительный параметр, и мне придется изменить все занятия.

есть что-то вроде структуры для параметров шаблона?

что-то вроде

struct {
  DIMENSION = 3;
  DATATYPE = int;
  OPERATIONS = SimpleOps;
} CONFIG;

template <class CONFIG>
class Simulation{ ... }

template <class CONFIG>
class SimulationNode{ ... }

template <class CONFIG>
class SimulationDataBuffer{ ... }

1 ответов


конечно, сделайте шаблон класса, который предоставляет псевдонимы для ваших типов и static член для int.

template <int DIMENSION, class DATATYPE, class OPERATIONS>
struct Config
{
    static constexpr int dimension = DIMENSION;
    using datatype = DATATYPE;
    using operations = OPERATIONS;
};

тогда вы можете использовать его следующим образом:

template <class CONFIG>
class Simulation{
    void foo() { int a = CONFIG::dimension; }
    typename CONFIG::operations my_operations;
}

using my_config = Config<3, int, SimpleOps>;
Simulation<my_config> my_simulation;