Я хотел бы дать аргументу шаблона тип и значение по умолчанию. Аргумент на самом деле не используется, он важен только для различения экземпляров класса. Я хочу использовать механику, чтобы дать классам ключ.
Я пробую что-то подобное, но компилятору это не нравится
template<typename K = int>
template<typename T, K Key = K(0)>
class DataAction : public Action
{
// ...
};
Тип T
хранит данные для меня. Тип Key
имеет определенное значение, позволяющее легко использовать типы enum class
, и по умолчанию должен быть int 0
, если не назначен.
Следующее будет работать.
template<typename T, typename K = int, K Key = K(0)>
class DataAction : public Action
Но это требует, чтобы я сначала определил тип, а затем значение, что нехорошо.
auto instance = DatatAction<int, SomeEnumType, SomeEnumType::SomeKey>();
Предполагается, что пользователь может захотеть использовать несколько экземпляров класса DataAction с одним и тем же типом данных T
. Чтобы иметь возможность различать их в dynamic_cast, который в любом случае требуется, используется дополнительный тип ключа.
В C++ 17 вы можете использовать параметр шаблона авто:
template <typename T, auto = 0>
class DataAction : public Action
{
}
Здесь 0 - это int, но вы также можете присвоить (char) 0 или другие типы, если вы действительно хотите запутать разные типы одного и того же значения. :)
Лично я предпочитаю один тип и никаких значений по умолчанию для такого рода вещей. Это позволяет избежать случайного повторного использования клавиш и путаницы со стороны зрителей.
Хорошо, похоже, это то, что решил C++ 17, но не C + 11, с которым я застрял. stackoverflow.com/questions/48608830/…