如何检查函数的模板参数是否具有某种类型?

时间:2011-10-04 12:35:18

标签: c++ templates typechecking

假设我有一个模板类型 T 的函数和另外两个类 A B

template <typename T>
void func(const T & t)
{
    ...........
    //check if T == A do something
    ...........
    //check if T == B do some other thing
}

如何进行这两项检查(不使用Boost库)?

3 个答案:

答案 0 :(得分:9)

如果您只想要一个布尔值来测试是否T == A,那么您可以使用is_same,在C ++ 11中可用作std::is_same,或者在TR1之前使用std::tr1::is_same作为const bool T_is_A = std::is_same<T, A>::value; {1}}:

template <typename, typename> struct is_same { static const bool value = false;};
template <typename T> struct is_same<T,T> { static const bool value = true;};

你可以自己写这个小课:

A

通常,您可能会发现将分支代码打包到专门用于Bif (T_is_A)的单独类或函数中会更方便,因为这会为您提供编译时条件。相比之下,检查{{1}}只能在运行时完成。

答案 1 :(得分:7)

创建具有专业化的功能模板,可以完成您想要的任务。

template <class T>
void doSomething() {}

template <>
void doSomething<A>() { /* actual code */ }

template <class T>
void doSomeOtherThing() {}

template <>
void doSomeOtherThing<B>() { /* actual code */ }

template <typename T>
void func(const T & t)
{
    ...........
    //check if T == A do something
    doSomething<T>();
    ...........
    //check if T == B do some other thing
    doSomeOtherThing<T>();
}

答案 2 :(得分:3)

如果您想为某些参数类型设置func的特殊实现,只需创建一个特定于该类型的重载:

template <typename T>
void func(const T & t) {
   // generic code
}

void func(const A & t) {
   // code for A
}