#include <iostream>

class BaseA
{
	int fa;
};

class BaseB
{
	int b;
};

class Derived : public BaseA, public BaseB
{
	int d;
};

template <class Base, class Derived>
struct is_sliced2 : public std::integral_constant<bool, 
	((void*)((Base*)((Derived*) 1))) != (void*)1> 
{};

template <class Base, class Derived>
bool is_sliced(const Derived* der)
{
	return (void*) der != (const Base*) der;
}

int main()
{
	Derived* derived = new Derived;
	BaseA* base_a = derived;
	BaseB* base_b = derived;
	//auto a = is_sliced<BaseA, Derived>(derived);
	//auto b = is_sliced<BaseB, Derived>(derived);

	static_assert(!is_sliced2<BaseA, Derived>::value, "Should be not sliced");
	static_assert( is_sliced2<BaseB, Derived>::value, "Should be sliced");
	return 0;
}
