【发布时间】:2015-11-02 02:05:57
【问题描述】:
在下面的类中,我定义了一个operator(),返回一个return_T的向量:
#include <vector>
template <typename return_T, typename ... arg_T>
class A
{
public:
std::vector<return_T> operator()(arg_T... args);
};
这有效,除了return_T = void 的情况,因为vector<void> 是不可能的。所以我需要以某种方式定义A<void, arg_T>::operator() 的专业化。我正在试验以下代码:
#include <vector>
template <typename return_T, typename ... arg_T>
class A
{
public:
auto operator()(arg_T... args);
};
template<typename return_T, typename... arg_T>
auto A<return_T, arg_T...>::operator()(arg_T... args) -> typename std::enable_if<!std::is_void<return_T>::value, std::vector<return_T>>::type
{ }
template<typename return_T, typename... arg_T>
auto A<void, arg_T...>::operator()(arg_T... args) -> void
{ }
但是编译器不喜欢它。
error : prototype for 'typename std::enable_if<(! std::is_void<_Tp>::value), std::vector<_Tp> >::type A<return_T, arg_T>::operator()(arg_T ...)' does not match any in class 'A<return_T, arg_T>'
auto A<return_T, arg_T...>::operator()(arg_T... args) -> typename std::enable_if<!std::is_void<return_T>::value, std::vector<return_T>>::type
error : candidate is: auto A<return_T, arg_T>::operator()(arg_T ...)
auto operator()(arg_T... args);
^
error : invalid use of incomplete type 'class A<void, arg_T ...>'
auto A<void, arg_T...>::operator()(arg_T... args) -> void
^
当然,我可以很容易地用void operator() 编写第二个类,但我很好奇它是否也可以用一个类来完成。所以我的问题是:这可能吗?
【问题讨论】:
标签: c++ templates c++14 template-specialization return-type