我设计的C++语法

采石工 2012-09-13 08:51:14

class foobar
{
public:
foobar();
foobar(int a):_a(a){};
int get<>value();
int _a;
}
int foobar::get<>value()
{
return _a;
}

foobar f(1);
//下面三种调用方法均可
//传统方法仍然适用
f.getvalue();
//传统方法适用于新语法
f.get<>value();
//新的调用成员函数的方法,语义更清晰些
get<f>value();

...全文
2136 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
帖子不能编辑 2012-09-19
  • 打赏
  • 举报
回复
楼主有这爱好?
四哥 2012-09-17
  • 打赏
  • 举报
回复
好丑的语法,真要让你设计打死不用C++
子达如何 2012-09-16
  • 打赏
  • 举报
回复
直接添加一个关键字,自动生成get set方法才是王道。
starcbh 2012-09-14
  • 打赏
  • 举报
回复
蛋碎了~~~~~~~~~~~
Star-light 2012-09-13
  • 打赏
  • 举报
回复

struct value{};
int get(value v, const foobar& f) {
return f._a;
}
get(value(), f);


用tag dispatch就可以了,也没比新语法多码多少字
pl___ 2012-09-13
  • 打赏
  • 举报
回复
[Quote]
//传统方法适用于新语法
f.get<>value();
//新的调用成员函数的方法,语义更清晰些
get<f>value();
[/Quote]

这个比f.value<xx>() 的优势在哪里
一个操作对应多种方法, 总感觉不KISS
Joseph_1118 2012-09-13
  • 打赏
  • 举报
回复
那LZ知道怎么去实现它不?
不要把思想局限在语言的语法,你可以深入,去想想C++是怎么实现的!
zhanshen2891 2012-09-13
  • 打赏
  • 举报
回复
有点全局函数的意思。说实话我觉得你这个Get有点多余。

f.getvalue难道不清楚么?这样更通用,函数并不是只有get和set。
Star-light 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

C/C++ code

struct value{};
int get(value v, const foobar&amp; f) {
return f._a;
}
get(value(), f);



用tag dispatch就可以了,也没比新语法多码多少字



你这东西在c++中早就有了 叫成员变量指针
C/C++ ……
[/Quote]

宏有宏的用法,虽然大家码的都是get,但是本质上是不一样的。

宏很多时候是没办法用在模板里的,想想下面这个例子,不是所有类都可以用宏的
而用tag dispatch的话只要overload对应的get(value, XXX)就可以了。

template<class T>
void do_something( const T& f) {
int res = get(value(), f);
std::cout << res << std::endl;
}


还有种方法是模板特化

template<class Tag, class T>
int get(const T& f);
template<>
int get<value, foobar>(const foobar& f) {
return f._a;
}
...
get<value>(f)
...

上面的语法是不是已经和lz的很像了?
但特化不是很灵活,感觉没有overload好,详见effective c++
wangchao_815 2012-09-13
  • 打赏
  • 举报
回复
楼主想法不错
pl___ 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C/C++ code

struct value{};
int get(value v, const foobar& f) {
return f._a;
}
get(value(), f);



用tag dispatch就可以了,也没比新语法多码多少字
[/Quote]


你这东西在c++中早就有了 叫成员变量指针

int my_class::* val_offset= &my_class::value;
my_class obj;
//.....
obj.(*val_offset) = 10;
//你那个get(v,f)可以写成这样
#define get(v,f) (f.*v)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧