Функция enable_if, когда тип содержит статическую переменную с указанным именем и типом

Я пытаюсь заставить работать вещь, описанную в названии.

template <class T>
void foo(const Foo* f) // this is general case template
{

}

// this should work only if T has static variable named _Foo with type const Foo*
template <class T>
typename std::enable_if<std::is_same<decltype(T::_Foo), const Foo*>::value>::type
foo(const Foo* f)
{
T::_Foo = f;
}

Но он не компилируется с:

error C2039: 'type' : is not a member of 'std::enable_if<false,void>'

Не должно ли это быть по умолчанию для первой реализации, если enable_if не удается? Я имею в виду то, что мне здесь не хватает, может кто-нибудь объяснить мне, что не так и, возможно, что является решением. (У меня есть ощущение, что проблема заключается в этом наивном decltype (T :: _ Foo))

1

Решение

Это работает только в том случае, если задействован выведенный аргумент шаблона. Вам, вероятно, нужно добавить уровень косвенности, а также отключить первый метод в случае T делает иметь подходящий _Foo, Или, в качестве альтернативы, я покажу, как снизить приоритет для разрешения перегрузки с помощью ... против int:

template <class T>
void foo_impl(const Foo* f, T*, ...) // this is general case template
{

}

// this should work only if T has static variable named _Foo with type const Foo*
template <class T>
typename std::enable_if<std::is_same<decltype(T::_Foo), const Foo*>::value>::type
foo_impl(const Foo* f, T*, int)
{
T::_Foo = f;
}

template <class T>
void foo(const Foo* f) // this is general case template
{
return foo_impl(f, (T*)nullptr, 0);
}

Живой пример

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector