1

假设我有一个模板类定义为:

template < typename A, typename B >
class something { ... }

如何测试类型 A 和 B 是否属于同一类型?我知道这可以在运行时使用 typeid 完成,但我真的需要这是一个编译时测试。

另外,如果 A 类型和 B 类型相同,我该如何专业化该课程?

在现实世界中,A 将是某种 stl 容器,例如 std::string,而 B 将是 char 或 wchar_t。在内部我已经检查了容器 value_type (如果不是预期的编译错误)。如果 B 与容器 value_type 相同,则类中的大部分代码将变得多余。

4

3 回答 3

6

另外,如果 A 类型和 B 类型相同,我该如何专业化该课程?

正是如此,专门:

template <typename A>
class something<A,A> { ... }

模板对其参数列表使用模式匹配,就像在许多函数式编程语言中看到的那样。

如何测试类型 A 和 B 是否属于同一类型?

您可以使用std::is_same,或使用上述专业化。这取决于您的确切用例。

于 2013-07-05T10:43:55.023 回答
4

您可以使用以下方法检查类型是否相同:

std::is_same<A, B>::value

当它们存在时,它将返回 true。

于 2013-07-05T10:45:44.170 回答
1

这个怎么样

template <typename A, typename B>
struct EnsureSameType {};

template <typename A>
struct EnsureSameType<A, A> {
    typedef int the_template_types_are_different;
};

int main()
{
    /* this should compile */
    typedef EnsureSameType<std::string::value_type, char>::the_template_types_are_different _;
    /* this should fail, and you will see the compiler
       remind you that the_template_types_are_different */
    typedef EnsureSameType<std::string::value_type, wchar_t>::the_template_types_are_different _;
    return 0;
}
于 2013-07-05T10:52:12.333 回答