Это один из способов решить вашу проблему так, как вы хотите:
template<typename T, typename U = NullType>
struct TemplateStruct
{
TemplateStruct(int i)
{
boost::enable_if< boost::is_same<U,NullType>, void*>::type var = nullptr;
std::cout << "One Param == " << i << std::endl;
}
TemplateStruct(int i, int j)
{
boost::disable_if< boost::is_same<U,NullType>, void*>::type var = nullptr;
std::cout << "Two Param == " << i << "," << j << std::endl;
}
};
int main()
{
TemplateStruct<TestType>(1);
TemplateStruct<TestType,NonNull>(1,2);
//will not compile TemplateStruct<TestType>(1,2);
//will not compile TemplateStruct<TestType,NonNull>(1);
}
РЕДАКТИРОВАТЬ1: или, если выбранный вами компилятор и используемая вами реализация STL поддерживают static_assert и traits type (то есть VS 2010 поддерживает), вы можете получить лучшие сообщения об ошибках, если попытаетесь использовать отключенный ctor:
template<typename T, typename U = NullType>
struct TemplateStruct
{
TemplateStruct(int i)
{
static_assert( std::is_same<U,NullType>::value, "Cannot use one parameter ctor if U is NullType!" );
std::cout << "One Param == " << i << std::endl;
}
TemplateStruct(int i, int j)
{
static_assert( !std::is_same<U,NullType>::value, "Cannot use two parameter ctor if U is not NullType!" );
std::cout << "Two Param == " << i << "," << j << std::endl;
}
};
EDIT2: или, если в вашем STL нет is_same, но у вас есть static_assert:
template<typename T, typename U = NullType>
struct TemplateStruct
{
TemplateStruct(int i)
{
static_assert( boost::is_same<U,NullType>::value, "Cannot use one parameter ctor if U is NullType!" );
std::cout << "One Param == " << i << std::endl;
}
TemplateStruct(int i, int j)
{
static_assert( !boost::is_same<U,NullType>::value, "Cannot use two parameter ctor if U is not NullType!" );
std::cout << "Two Param == " << i << "," << j << std::endl;
}
};