这在 c++11 中可能吗?两个同名但一个带有模板的类。 前任:
一个具有名称Result
的类和另一个具有名称的类Result<T>
使用,例如
return Result("Message");
或
Result<Date>("Message", date);
例如,我尝试了这个但没有成功:
template<>
class response
{
public:
bool sucess;
std::string message;
int code;
};
template<typename T>
class response<T>
{
public:
T data;
};
几个C++11选项:
提供默认模板参数void
并专门用于此。
template<class T = void>
class response
{
public:
bool success;
std::string message;
int code;
T data;
};
template<>
class response<void>
{
public:
bool success;
std::string message;
int code;
};
那么response<>
将意味着response<void>
并且不会有data
成员。但是,您仍然必须编写response<>("Message")
而不是response("Message")
(在您的实际代码中,您可能希望提供response
构造函数,以便可以直接像这样初始化它们。
可用于增强此值的一个选项是工厂函数,因为函数重载集可以同时包含非模板化函数和函数模板。因此,例如,您可以有一个make_response
函数:
// Assuming the appropriate response constructors exist
response<> make_response(std::string t_message)
{
return response<>{t_message};
}
template<class T>
response<T> make_response(std::string t_message, T t_data)
{
return response<T>{t_message, t_data};
}
然后make_response("Message")
将创建一个没有data
成员的response<>
,也就是一个response<void>
,make_response("Message", date)
将创建一个response<Date>
有一个成员。