#include <algorithm>
#include <functional>
#include <iostream>
#include <memory>
#include <string>
#include <type_traits>
#include <utility>


struct field
{
    template<typename TDataType, typename = typename
            std::enable_if< std::is_fundamental<TDataType>::value &&
                            std::is_same<TDataType, std::nullptr_t>::value == false &&
                            std::is_same<TDataType, void>::value == false>::type>
    void set_data(TDataType data, size_t index = 0)
    {
    	std::cout << "Fundamental\n";
    }

    template<typename TDataType, typename = void, typename = typename
            std::enable_if< std::is_same<std::string, TDataType>::value ||
                            std::is_same<char const *, TDataType>::value>::type>
    void set_data(TDataType data, size_t index = 0)
    {
    	std::cout << "String\n";
    }
};


int main()
{
	field f;
	f.set_data("abc");
	f.set_data(7);
}