Использование sfinae для выбора функции/конструктора, только если тип имеет член [дубликат]C++

Программы на C++. Форум разработчиков
Anonymous
 Использование sfinae для выбора функции/конструктора, только если тип имеет член [дубликат]

Сообщение Anonymous »

Я пытаюсь разрешить создание моего класса только из типа, имеющего член size(). Я попробовал 2 подхода:

Код: Выделить всё

#include 
#include 

// Approach #1
template 
struct HasSize : std::false_type { };
template 
struct HasSize  : std::true_type { };
template 
inline constexpr bool has_size1_v = HasSize::value;

// Approach #2
template 
inline constexpr bool has_size2_v =
std::is_integral_v;

class MySpan {
public:
MySpan() = default;
MySpan(std::size_t len) {}

// ********
template 
//   template 
// ********
MySpan(T&& c) : MySpan(c.size()) {}
};

void foo(long) {}

template 
void foo(T v) { MySpan s(v); }

struct MyStruct {
int size() { return 0; }
};

int main() {
int i;
foo(i);
}

static_assert(has_size1_v); // fails
static_assert(has_size2_v); // ok
Ни один из подходов не работает. Как вы можете видеть в конце, подход № 1 по какой-то причине не выполняет статическое утверждение. Но подход № 1 работает - когда я включаю его в части, отмеченной ********, код в main компилируется нормально.
Когда я переключаюсь на подход #2 (в части, отмеченной ********) main не компилируется.
Все это можно увидеть здесь: https:/ /godbolt.org/z/GM5PPcYz3
Я не понимаю, почему каждый подход работает в одном месте, но не работает в другом, и также хотел бы найти способ, который работает везде

Подробнее здесь: https://stackoverflow.com/questions/790 ... has-member

Вернуться в «C++»