您是否可以将函数调用作为案例语句标签。例如:
char x
switch(x)
{
case isCapital():
capitalcount++;
break;
case isVowel():
vowelcount++;
break;
.
.
.
.
.
}
这是否允许在C ++中使用?
答案 0 :(得分:4)
案例标签中的值必须是常量表达式。也就是说,您当前问题的答案是:是的,您可以调用案例标签中的某些功能。但是,不是你试图打电话的那些。但是,您可以让多个标签引用一组语句:
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
do_vowels();
break;
答案 1 :(得分:4)
我知道这本身并没有回答你的问题,但你可能会尝试这样编码......
capitalcount += isCapital(x);
vowelcount += isVowel(x);
isXXX()函数的布尔返回类型将被提升为int,并将计数添加为0(false)或1(true)。
答案 2 :(得分:0)
首先:在您的所需代码中isCapital
和isVowel
应该不是函数(绝对不是函数调用),而是仿函数 - 因为检查一个值,他们必须通过参数...
无论如何,你的代码在C ++中是不可能的......但是可以使用一系列函数来模拟:谓词+效果。谓词必须采用一些参数并用布尔值作出响应。如果谓词为true
,则效果将为smth。要模拟中断和后退到下一个case
(即当case
)效果函数没有中断时,还必须返回一个布尔值。
示例代码可能如下所示:
#include <cctype>
#include <functional>
#include <iostream>
#include <vector>
int main(int argc, char* argv[])
{
typedef std::vector<
std::pair<
std::function<bool(char)> // predicate
, std::function<bool()> // effect: return true if `break' required
>
> case_seq_t;
unsigned digits = 0;
unsigned upper = 0;
unsigned lower = 0;
unsigned total = 0;
unsigned other = 0;
case_seq_t switch_seq = {
{
// predicate lambda can be replaced by std::bind
// in this simple case... but need to change param type.
// std::bind(&std::isdigit, std::placeholders::_1)
[](char c) { return std::isdigit(c); }
, [&]() { digits++; return true; }
}
, {
[](char c) { return std::islower(c); }
, [&]() { lower++; return true; }
}
, {
[](char c) { return std::isupper(c); }
, [&]() { upper++; return true; }
}
// `default` case
, {
[](char c) { return true; }
, [&]() { other++; return true; }
}
};
for (int i = 1; i < argc; i++)
for (int pos = 0; argv[i][pos]; pos++)
for (const auto& p : switch_seq)
if (p.first(argv[i][pos]))
if (p.second())
break;
std::cout << "digits=" << digits << std::endl;
std::cout << "upper=" << upper << std::endl;
std::cout << "lower=" << lower << std::endl;
std::cout << "other=" << other << std::endl;
return 0;
}
不像switch
那么简单,但是(恕我直言)显而易见......而且,在某些实际情况下,可能具有更好的灵活性(并且可能具有可维护性):)