Using a typical capped crowdsale smart contract you can control the contribution so it always stays within the
softCap - hardCap range.
When the ICO accepts ETH then it's quite easy. You can just compare the total amount raised at that point and verify it's within the acceptable range e.g. 1M-20M dollars (or the equivalent amount in ETH) where the hard cap should essentially give the total supply of the token e.g. 100M
When the contribution is available with BTC and/or Fiat then I'm not quite sure how we can check whether we are within the acceptable range at that everyone will get his tokens (i.e. the sum of tokens doesn't exceed 100M).
Does anyone know how the ICO that accept ETH, BTC and Fiat deal with soft and hard cap?