В C SFINAE (ошибка замены не является ошибкой) позволяет вам включить или отключить код в зависимости от типа аргумента шаблона. Однако при работе с функциями-членами шаблона класса SFINAE часто не работает должным образом.
Вот пример, демонстрирующий проблему:
#include
struct A {};
struct B {};
template
struct Foo
{
typename std::enable_if<:is_same a>::value>::type bar()
{}
typename std::enable_if<:is_same b>::value>::type bar()
{}
};
В этом примере Foo определяет две перегруженные функции-члены bar(). Первая перегрузка активируется, когда T равно A, а вторая активируется, когда T равно B. Однако если вы попытаетесь скомпилировать этот код, вы получите сообщение об ошибке, указывающее, что перегрузки не могут быть разрешены.
Причина этой ошибки заключается в том, что SFINAE работает только для выведенных аргументов шаблона. В случае функций-членов шаблона класса аргумент шаблона не выводится, а указывается явно. Чтобы устранить эту проблему, вы можете использовать один из следующих методов:
Используйте явные аргументы шаблона:
struct Foo
{
void bar(A) {}
void bar(B) {}
};
Используйте std::enable_if внутри функций-членов:
template
struct Foo
{
template
typename std::enable_if<:is_same a>::value>::type bar() {}
template
typename std::enable_if<:is_same b>::value>::type bar() {}
};
Использовать явную специализацию шаблона класса:
template struct Foo { void bar() {} };
template struct Foo { void bar() {} };
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3