Ограниченный тип метода шаблона C ++ - PullRequest
0 голосов
/ 08 апреля 2020

Мне нужно создать шаблонную функцию, чье значение T является дочерним для базового класса (Actor). В C# это делается так:

//C#
public T Create<T>() where T : Actor
{
}

Если вы посмотрите на C# MSD ( здесь ):

где в определении обобщенного c указывает ограничения на типы, которые используются в качестве аргументов для параметров типа в обобщенном типе, методе, делегате или локальной функции. [ ... ]

Итак, я попробовал это в своем коде C ++, но мне было интересно найти другие способы сделать это. Что-то более заметное, что не позволяет вам присвоить этой функции неподдерживаемое значение и / или, если вы это сделаете, вы легко обнаружите ошибку. Этот способ не подходит для меня.

//C++
template<typename T>
T* Create()
{
    static_assert(std::is_base_of<Actor, T>::value, L"T must inherit from Actor");

    //Some code
    return actor;
}

Заранее спасибо и приветствую!

1 Ответ

0 голосов
/ 09 апреля 2020

Наконец-то я получил то, что делает именно то, что я искал. Это дает вам информацию в режиме реального времени об ошибке без необходимости строить решение. Это самая похожая вещь на C#, которую я нашел. Как это работает и для вас.

//T must inherit from Actor
template<typename T>
typename std::enable_if<std::is_base_of<Actor, T>::value, T*>::type Create()
{
    //Some code
    return actor;
}

Более подробную информацию о std :: enable_if вы можете найти здесь .

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

...