gpt4 book ai didi

c++ - 为包含 typedef 的类型专门化模板

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:49 25 4
gpt4 key购买 nike

我有一个模板类需要专门用于包含特定 typedef 的模板参数。所以我需要两个定义,一个用于它有 typedef 的情况,另一个用于它没有的情况。

我的问题是我不知道如何否定 SFINAE。我显然可以消除非特殊参数的特殊情况,但我不知道如何消除特殊参数的默认值。

所以我尝试了这样的部分特化:

struct NormalType { };

struct SpecialType { typedef int special; };

template <typename T, typename IsSpecial = void>
struct DetectSpecial {
void detected() { std::cout << "Not special...\n"; }
};

template <typename T>
struct DetectSpecial<T, typename T::special> {
void detected() { std::cout << "Special!\n"; }
};

但是特化没有被使用(as SSCCE on ideone)。

我也考虑过使用 enable_if ,但我看不出如何将它用于格式正确和格式不正确的表达式,而不是 true/false。

为包含特定 typedef 的类型定义 DetectSpecial 的最简单方法是什么(typedef 的值可以是任何东西;它的存在很重要)?

哦,我仍然坚持使用某些 C++03 编译器。无论如何,我认为 SFINAE 没有任何变化。

最佳答案

所需的最小更改是在依赖于 T::special 的特化中插入一些表达式并产生 void(以匹配默认参数)。例如:

template<class T>
struct void_alias
{
typedef void type;
};

template <typename T>
struct DetectSpecial<T, typename void_alias<typename T::special>::type> {
void detected() { std::cout << "Special!\n"; }
};

关于c++ - 为包含 typedef 的类型专门化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992267/

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