#include <iostream>
#include <type_traits>

struct A
{
    void foo() { std::cout << "A::foo()\n" ; }
    void foo() const { std::cout << "A::foo() const\n" ; }
};

template < typename T > struct B
{
    void bar() { const_cast<T&>(data).foo() ; }

    private: typename std::remove_const<T>::type data ;
};

int main()
{
    B<A> x ; x.bar() ; // A::foo()

    B<const A> y ; y.bar() ; // A::foo() const
}
