這是一種方法。有可能通過一些模板構建與開關/外殼相同的邏輯。
注意在每種情況下使用lambdas執行代碼。這確保只有一個代碼路徑被採用。
這是一個簡單的例子。請注意,在經過優化的版本中,這可能不會比開關/外殼更有效率。
#include <iostream>
template<class T>
struct Switcher
{
Switcher(T const& value) : value_(value) {}
template<class F>
auto On(T const& candidate, F&& f) -> Switcher&
{
if (not satisfied_ and candidate == value_)
{
satisfied_ = true;
f();
}
return *this;
}
template<class F>
auto Otherwise(F&& f)
{
if (not satisfied_) {
satisfied_ = true;
f();
}
}
private:
T const& value_;
bool satisfied_ = false;
};
template<class T> auto Switch(T const& value)
{
return Switcher<T>(value);
}
int main(int argc)
{
Switch(argc)
.On(1, []{ std::cout << "one arg\n"; })
.On(2, []{ std::cout << "two args\n"; })
.Otherwise([]{ std::cout << "more args\n"; });
}
任何像樣的編譯器都會提醒你。 –
請參閱https://stackoverflow.com/questions/8809154/how-to-make-gcc-clang-warn-about-missing-breaks-in-switch-statements – stijn
@πάνταῥεῖ而且在許多情況下,這是功能和預期行爲,而不是一個錯誤。 – i486