pmr*_*pmr 2 c++ inheritance templates template-meta-programming c++11
我尝试编写一个类,它将一个函数元组作为参数,并operator()为所有argument_type函数重载.现在这看起来像这样:
template<typename T>
struct holder {
T t;
};
template<typename T, std::size_t i>
struct overload_helper : public holder<T>, public overload_helper<T, i - 1> {
overload_helper(T t) : holder<T>({t}) {};
typedef typename std::tuple_element<i - 1, T>::type inner_type;
typename inner_type::result_type operator()(typename inner_type::argument_type x) {
return std::get<i - 1>(holder<T>::t)(x); }
};
template<typename T>
struct overload_helper<T, 1> {
typedef typename std::tuple_element<0 ,T>::type inner_type;
typename inner_type::result_type operator()(typename inner_type::argument_type x) {
return std::get<0>(holder<T>::t)(x); }
};
template<typename T>
struct overload : public overload_helper<T, std::tuple_size<T>::value>
{
typedef void result_type;
overload(const T& t) : overload_helper<T, std::tuple_size<T>::value>(t) { }
};
int main() {
auto all = make_overload(std::make_tuple(
std::function<void(double)>([](double i) {
std::cout << "double" << std::endl;
}), std::function<void(int)>([](int i) {
std::cout << "int" << std::endl; })));
all(1); //fails
all(1.0);
}
Run Code Online (Sandbox Code Playgroud)
问题是基类隐藏了每个递归定义operator().是否有可能以递归方式取消隐藏所有定义,using或者是获得模板化operator()并选择正确重载的唯一方法boost::mpl?
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |