Это легко объяснить на примере. Рассмотрим
struct Cat { void meow() { } };
struct Dog { void bark() { } };
и
template
void pet(T x)
{
if(std::is_same{}){ x.meow(); }
else if(std::is_same{}){ x.bark(); }
}
Вызов
pet(Cat{});
pet(Dog{});
приведет к ошибке компиляции (пример wandbox) , потому что обе ветви оператора if
должны быть хорошо сформированы.
prog.cc:10:40: error: no member named 'bark' in 'Cat'
else if(std::is_same{}){ x.bark(); }
~ ^
prog.cc:15:5: note: in instantiation of function template specialization 'pet' requested here
pet(Cat{});
^
prog.cc:9:35: error: no member named 'meow' in 'Dog'
if(std::is_same{}){ x.meow(); }
~ ^
prog.cc:16:5: note: in instantiation of function template specialization 'pet' requested here
pet(Dog{});
^
Для изменения pet
для использования if constexpr
template
void pet(T x)
{
if constexpr(std::is_same{}){ x.meow(); }
else if constexpr(std::is_same{}){ x.bark(); }
}
требуется только ветви, подлежащие анализу - только ветвь, которая соответствует условию, должна быть хорошо сформирована (пример wandbox) .
Отрывок
pet(Cat{});
pet(Dog{});
будет компилироваться и работать должным образом.
Хорошо, я понял это. WOHOOO !!!
Я добавляю код на тот случай, если кому-то еще понадобится.
Теперь, чтобы выяснить, как ограничить определенные таблицы для каждого нового пользователя ....
Спасибо,
try {
String username = "";
String password = "";
username = UsernametextField.getText().trim();
password = PasswordtextField.getText().trim();
if (username.equals("")|| password.equals(""))
{
JOptionPane.showMessageDialog(null," name or password is wrong","Error",JOptionPane.ERROR_MESSAGE);
}
else
{
connection = DriverManager.getConnection(AdminMenu.DATABASE_URL, AdminMenu.UserName, AdminMenu.Password);
statement = connection.createStatement();
resultSetInt = statement.executeUpdate("CREATE LOGIN "+username+" WITH PASSWORD = '"+password+"'");
resultSetInt = statement.executeUpdate("IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'"+username+"') CREATE USER ["+username+"] FOR LOGIN ["+username+"] EXEC sp_addrolemember N'db_owner', N'"+username+"'");
//("CREATE LOGIN NewAdminName WITH PASSWORD = 'ABCD' GO USE BEPAWI GO IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'NewAdminName') BEGIN CREATE USER [NewAdminName] FOR LOGIN [NewAdminName] EXEC sp_addrolemember N'db_owner', N'NewAdminName' END;) VALUES('"+username+"', '"+password+"');");
String SMessage = "Record added for "+username;
// create dialog ox which is print message
JOptionPane.showMessageDialog(null,SMessage,"Message",JOptionPane.PLAIN_MESSAGE);
//close connection
((java.sql.Connection)connection).close();
}
}
catch (SQLException se)
{
//handle errors for JDBC
se.printStackTrace();
}
catch (Exception a) //catch block
{
a.printStackTrace();
}
}
});