Код: Выделить всё
#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
Когда я переключаюсь на подход #2 (в части, отмеченной ********) main не компилируется.
Все это можно увидеть здесь: https:/ /godbolt.org/z/GM5PPcYz3
Я не понимаю, почему каждый подход работает в одном месте, но не работает в другом, и также хотел бы найти способ, который работает везде
Подробнее здесь: https://stackoverflow.com/questions/790 ... has-member