【发布时间】:2017-04-20 22:10:29
【问题描述】:
我遇到这样一个场景:
- 需要定义一个接口
- 接口的参数类型和数量是任意的
所以,我需要一个模板函数,作为一个接口,它应该是虚拟的,但是编译器无效,有什么办法吗?
示例代码:
struct none
{};
template<typename T>
struct stru_result
{
int result_code;
T result;
stru_result() :result_code(0)
{}
stru_result(const int& code) :result_code(code)
{}
stru_result(const int&code, const T& res) :result_code(code), result(res)
{}
stru_result(stru_result&& res)
{
result_code = res.result_code;
result = std::move(res.result);
}
stru_result(const stru_result& res)
{
result_code = res.result_code;
result = res.result;
}
void operator = (const stru_result& res)
{
result_code = res.result_code;
result = res.result;
}
};
template<>
struct stru_result<none>
{
int result_code;
stru_result():result_code(0)
{}
stru_result(const int& code):result_code(code)
{}
};
class itest
{
public:
template<typename T, typename ...Args>
virtual int get_reply_atall(std::tuple<stru_result<T>, stru_result<Args>...>& aoTuple) = 0;
};
class ctest : public itest
{
public:
ctest() {}
~ctest() {}
template<typename T, typename ...Args>
int get_reply_atall(std::tuple<stru_result<T>, stru_result<Args>...>& aoTuple) ;
};
template<typename T, typename...Args>
int ctest::get_reply_atall(std::tuple<stru_result<T>, stru_result<Args>...>& aoTuple)
{
std::tuple<stru_result<T>> firstTuple;
get_reply_atall<T>(firstTuple);
std::tuple<stru_result<Args>...> resTuple;
get_reply_atall(resTuple);
aoTuple = std::tuple_cat(firstTuple, resTuple);
return 0;
}
template<>
int ctest::get_reply_atall<int>(std::tuple<stru_result<int>>& aoTuple)
{
stru_result<int> res = stru_result<int>(0, 1);
aoTuple = std::make_tuple(res, res);
return 0;
}
template<>
int ctest::get_reply_atall<char*>(std::tuple<stru_result<char*>>& aoTuple)
{
char* ptr = "test";
stru_result<char*> res = stru_result<char*>(0, ptr);
aoTuple = std::make_tuple(res);
return 0;
}
【问题讨论】:
-
你能通过接口的参数类型和计数在运行时指定来解释你想要什么吗?
-
可能使“接口”类模板化,而不是函数,可以解决您的问题
-
templated 成员函数不能是虚拟的。您需要重新考虑您的设计 -
"所以,我需要一个模板函数..." 你的意思是,参数类型是在编译时选择的?否则你的结论没有意义。如果在运行时选择了类型,则不能使用模板
-
@tobi303 我需要使用redis的管道,不想暴露回复对象点,所以我需要这样一个接口来给出结果。请求顺序是任意的,所以类型和顺序应该是任意的,我只是这么认为,不确定正确与否。但是你提醒我它没有在运行时指定,仍然是编译时,谢谢
标签: c++ c++11 templates virtual