我设计的C++语法
本帖最后由 quarryman 于 2012-09-13 09:01:05 编辑
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();
[解决办法]
有点全局函数的意思。说实话我觉得你这个Get有点多余。
f.getvalue难道不清楚么?这样更通用,函数并不是只有get和set。
[解决办法]
这个比f.value<xx>() 的优势在哪里
一个操作对应多种方法, 总感觉不KISS
[解决办法]
struct value{};
int get(value v, const foobar& f) {
return f._a;
}
get(value(), f);
用tag dispatch就可以了,也没比新语法多码多少字
[解决办法]
你这东西在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)
[解决办法]
楼主想法不错
[解决办法]
宏有宏的用法,虽然大家码的都是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++
[解决办法]
那LZ知道怎么去实现它不?
不要把思想局限在语言的语法,你可以深入,去想想C++是怎么实现的!