c++templatesc++14template-variables

template<typename T>: only static data member templates are allowed


class value {
    template<typename T> T value_1;
    float value_2;

public:
    template<typename T> void Set1(T first) {
        value_2 = (float)0;
        value_1 = first;
    }

    void Set2(float second) {
        value_2 = second;
    }

    float Get2() {
        return this->value_2;
    }

    template<typename T> T Get1() {
        return value_1;
    }
};

Value_1 gives out an error, saying that only static data member templates are allowed. Is there a way to keep value_1 without a type?


Solution

  • The type of a non-static data member must be known. Otherwise, what's sizeof(value)?

    To store a value of an arbitrary type, you can use std::any or boost::any.

    Use:

    class value {
        std::any value_1;
        float value_2;
    
    public:
        template<typename T> void Set1(T first) {
            value_2 = (float)0;
            value_1 = first;
        }
    
        void Set2(float second) {
            value_2 = second;
        }
    
        float Get2() {
            return this->value_2;
        }
    
        template<typename T> T Get1() {
            return std::any_cast<T>(value_1);
        }
    };