Hi Jerry,
From your code sample, it looks like you're trying to reinvent a technique known in C++ as "type erasure."
In today's C++, that would look like this:

#include "unique_printable.h"  // see https://quuxplusone.github.io/blog/2020/11/24/type-erased-printable/

struct arrItem {
    int key;
    UniquePrintable item1;
    UniquePrintable item2;
};

int main()
{
    std::vector<arrItem> DataList;
    DataList.push_back({ 0, 101, 102.10 });
    DataList.push_back({ 1, 201, 202 });
    DataList.push_back({ 2, 301, "hello world" });  // just for fun
    for (auto& [key, item1, item2] : DataList) {
        std::cout << "key: " << key << "; item1: " << item1 << "; item2: " << item2 << "\n";
    }
}

Here is the C++17 code all worked out, and executing correctly, on Godbolt.
https://godbolt.org/z/bdPTT7oeo

I've omitted any equivalent of your `Example_1` and `Example_2` wrappers, because I didn't think they were important to the technique you were trying to show. But you can certainly see how to re-introduce them if you need to; and how to use type erasure for operations other than simple printing, as well.
See also "Back to Basics: Type Erasure" (CppCon 2019): https://www.youtube.com/watch?v=tbUCHifyT24

HTH,
Arthur


On Tue, Jul 13, 2021 at 8:46 AM Jaroslav Moravec via Std-Proposals <std-proposals@lists.isocpp.org> wrote:
New proposal, version 2.

Abstract

The C++ language is here for more that 36 years and is still under development. Sometimes, C++ borrows some ideas from other programming languages, sometimes works on its own way. Presented proposal try to introduce a new type of basic variable which would be capable to hold a type of a variable or a type of a class or a struct. This variable should be capable to define target new type in type-cast operations such us: static_cast or dynamic_cast etc. Both at running time and at compilation time. Type of a variable or a class/struct is usually given by its unique name. Thus, the new basic variable should contain a string – the name of basic datatype or a type of user defined datatype. This name is then used in the type-cast operation at running time. The target type is, of course, well known at compilation time.
--
Std-Proposals mailing list
Std-Proposals@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals