gpt4 book ai didi

c++ - 检查 SFINAE 是否存在类型声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:35 25 4
gpt4 key购买 nike

我想使用 SFINAE 根据模板参数是否声明类型 T 来重载函数模板。到目前为止,这是我能够做到的:

struct C1 {
using T = int;
};

struct C2 {
using T = void; // but I would really like
// to not require T at all
};

// For classes that declare T
template <class C>
void f(C &c, typename std::enable_if<!std::is_same<typename C::T, void>::value,
int>::type = 0) {
(void)c;
std::cout << "With T" << std::endl;
}

// For classes that do not declare T (for now, T must be declared void)
template <class C>
void f(C &c, typename std::enable_if<std::is_same<typename C::T, void>::value,
int>::type = 0) {
(void)c;
std::cout << "Without T" << std::endl;
}

int main() {
C2 c;
f(c);
return 0;
}

如何(如果有的话)以 C2 根本不需要声明 T 的方式更改此解决方案? IE。我想要两个重载:一个用于声明 T 的类,一个用于不声明的类。

最佳答案

#include <type_traits>

template <typename...>
struct voider { using type = void; };

template <typename... Ts>
using void_t = typename voider<Ts...>::type;

template <typename C, typename = void_t<>>
struct has_t : std::false_type {};

template <typename C>
struct has_t<C, void_t<typename C::T>> : std::true_type {};

template <typename C>
auto f(C& c)
-> typename std::enable_if<has_t<C>::value>::type
{
}

template <typename C>
auto f(C& c)
-> typename std::enable_if<!has_t<C>::value>::type
{
}

DEMO

关于c++ - 检查 SFINAE 是否存在类型声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com