Skip to content

Instantly share code, notes, and snippets.

@Fiona-J-W
Created March 14, 2014 22:57
Show Gist options
  • Select an option

  • Save Fiona-J-W/9558771 to your computer and use it in GitHub Desktop.

Select an option

Save Fiona-J-W/9558771 to your computer and use it in GitHub Desktop.
#include <cassert>
#include <memory>
#include <stdexcept>
#include <tuple>
#include <utility>
#include <vector>
class base {
public:
virtual ~base() = default;
int id() const {return m_id;}
template<typename...T>
const std::tuple<T...>& virt_data() const;
protected:
base(int id): m_id(id) {}
private:
int m_id;
};
template<typename...T>
class derived: public base {
public:
derived(T...data, int id): base{id}, m_data{std::move(data)...} {}
const std::tuple<T...>& data() const {return m_data;}
private:
std::tuple<T...> m_data;
};
template<typename...T>
const std::tuple<T...>& base::virt_data() const {
auto& casted = dynamic_cast<const derived<T...>&>(*this);
return casted.data();
}
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
int main() {
std::vector<std::unique_ptr<base>> misc_data;
misc_data.push_back(make_unique<derived<int, float>>(2, 3.4f, 0));
misc_data.push_back(make_unique<derived<double>>(43.23, 1));
auto data = misc_data.at(0)->virt_data<int, float>();
assert(data == std::make_tuple(2, 3.4f));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment