【发布时间】:2017-01-11 15:46:00
【问题描述】:
我想实现一个类模板:
- 表现得像一个函数
- 它的输入和输出变量都是共享的。
- 相对容易使用。
因此,我构造了以下内容:
// all input/output variable's base class
class basic_logic_parameter;
// input/output variable, has theire value and iterators to functions that reference to this variable
template <typename FuncIterator, typename ValueType>
class logic_parameter
:public basic_logic_parameter
{
private:
std::list<FuncIterator> _refedFuncs;
ValueType _val;
public:
};
// all `function`'s base class
class basic_logic_function
{
public:
virtual ~basic_logic_function() = 0;
};
// the function, has input/output variable
template <typename FuncIterator, typename R, typename... Args>
class logic_function_base
:public basic_logic_function
{
private:
std::shared_ptr<logic_parameter<FuncIterator, R>> _ret;
std::tuple<std::shared_ptr<logic_parameter<FuncIterator, Args>>...> _args;
public:
template <std::size_t N>
decltype(auto) arg()
{
return std::get<N>(_args);
}
template <std::size_t N>
struct arg_type
{
typedef std::tuple_element_t<N> type;
};
template <std::size_t N>
using arg_type_t = arg_type<N>::type;
decltype(auto) ret()
{
return _ret;
}
};
我希望像这样使用:
// drawing need color and a pen
struct Color
{
};
struct Pen
{
};
struct Iter
{
};
class Drawer
:public logic_function_base<Iter, void(Color, Pen)>
{
public:
void draw()
{
arg_type_t<0> pColor; // wrong
}
}
我的编译器无法通过此代码,为什么?我只想将模板参数包转换为std::tuple of std::shared_ptr of them.
例如:
鉴于struct A, int, struct C,我想拥有:
std::tuple<
std::shared_ptr<logic_parameter<A>>,
std::shared_ptr<logic_parameter<int>>,
std::shared_ptr<logic_parameter<C>>,
>
【问题讨论】:
-
您的代码中有明显错误(
std::tuple_element_t缺少tuple或typename缺少),这些是复制/粘贴错误吗? -
R(Args...)本身并没有神奇地扩展为typename R, typename... Args,perpahs use a partial specialization and fix a couple of errors -
@Holt 这是一个打字错误:)
-
@PiotrSkotnicki 我稍后会尝试。谢谢!