In C++17, we have `std::void_t`, which makes SFINAE look a lot nicer:

```
template <typename T>
std::void_t<decltype(T::prop)> foo() { /* stuff */ }

```

The template function will exist only if `T::prop` exists.

If `T::prop` exists, the template function `foo()` would be equivalent to this:

```
template <typename T>
void foo() { /* stuff */ }

```

Otherwise, the code is equivalent to not declaring `foo()` at all.

Is there any generalization of `std::void_t` for other types in the standard library, such as the following:

```
template<typename T, typename...>
using generic_t = T;

```

so that the code below would be valid?

```
template <typename T>
std::generic_t<int, decltype(T::prop)> foo() { /* stuff */ }

```

which would be equivalent to

```
template <typename T>
int foo() { /* stuff */ }

```

if `T::prop` exists?