C ++ 03检查模板参数是否无效?

时间:2015-07-16 13:28:38

标签: c++

考虑一个函数

template <typename Ret>
Ret function(...) {
    Ret a;
    // . . . do something with a
    return a;
}

如果我将其称为

function<void>();

编译器说

  

错误:变量或字段'a'声明为void

     

错误:带有值的return语句,函数返回'void'[-fpermissive]

如何在此功能中强制执行检查,例如

template <typename Ret>
Ret function(...) {
    // if (Ret is void) return;
    Ret a;
    // . . . do something with a
    return a;
}

我知道C ++ 11有std::is_voidstd::is_same

bool same = std::is_same<Ret, void>::value;

C ++ 03中的任何内容?提前谢谢。

2 个答案:

答案 0 :(得分:4)

您可以专门编写或编写自己的is_same,这非常简单,当然也可以使用非标准库(例如boost)。

专业化

template<typename Ret>
Ret function(...)
{
   Ret a;
   // ...
   return a;
}

template<>
void function<void>(...)
{
}

自有

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

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

BTW与is_same并不是那么简单,你认为。您还需要专业化或重载

template<typename Ret>
typename enable_if<!is_same<Ret, void>::value, Ret>::type
function(...)
{
   Ret a;
   // ...
   return a;
}

template<typename Ret>
typename enable_if<is_same<Ret, void>::value, Ret>::type
function(...)
{
}

所以,专业化更简单。

答案 1 :(得分:1)

运行时if是不够的,模板的所有实例都必须是可编译的。在您的情况下,专业化可能是最好的行动方案:

template <typename Ret>
Ret function(...) {
    Ret a;
    // . . . do something with a
    return a;
}

template <>
void function<void>(...) {
    return;
}

此外,C ++ 03还有boost::is_same