The question isn't really about whether meta-programming is OK or not, but rather about whether it's OK to be better than the others on the team so here are a few controversial points about how I see it...
I recently moved to a new job where I am working in a larger team and this [meta-programming] worries some of my colleagues, because they do not comprehend it.
They are worried that you're better then them. That's good. You're going to be the new expert. You just destroyed their status-quo world.
I always try to leverage the full potential of the language, but some (not all) of my colleagues perceive that as a risk (some welcome the approach).
Sure, nobody likes to be less skilled than anyone else, so they are trying to stop you from using techniques that are too complex for them. They either cannot comprehend it or are not going to, because they feel secure now.
I agree it is a problem to write code that nobody else on the team can comprehend.
I don't. I think it's showing your expertise.
My question is, who is right, what should I do?
You should use all your skills to write the best code you can write and don't look behind at those who don't understand it. Otherwise you'll get stuck on their level and be just an ordinary coder. It's a good thing to be better than others, and it's a good thing to strive to be better than them. You'll never gain any new experience if you don't try to use anything new or do things differently.
I know I'm going to be downvoted, but this is how it looks like. It's not a crime to be better than others on the team, and it's not a crime to use your skills. It's just that everyone is afraid to admit it... because they are on the non-skilled side and hate it that the new guy suddenly can do something they can't. If they were clever, they'd ask you for help and for advice and not criticize your code for being incomprehensible.
There seems to be a lot of confusion about this question. As the comments show many people think it's about general code readability. No, it's not. It's about whether certain language features/constructs should be forbidden or avoided because some team members don't understand them.
My answer is no. They should not be forbidden. If you want to forbid something how would you do that? You'd have to prepare some kind of a questionnaire to find out what your team members can and cannot - or rather don't want to learn as I think all languague features are useful somewhere so knowing them and being able to use them is always good and the more you know the better code you can write. You'd also need a scale to define which features are beginner, intermediate or advanced ones.
In order to demonstrate how silly such restrictions are, let's take a really simple example: you are going to be hired as a software engineer but your future boss tells you that you will not be allowed to use
do/while loops because there are a couple of people on the team that have never used them before and also are not going to because they have always been using
for loops for everything so they find
do/while loops confusing.
Now you think this is stupid and crazy, don't you? But so is forbidding other features. Some poeple can use them and others don't want to learn them.
Why should you produce worse code if you know there is something that allows you to do the same with much less effort and yet result in a much more readable are robust code?
And it doesn't matter wheter you use only basic language features or advanced ones, you can use either one to produce an equally incomprihensible and unmaintainable code so this is an entirely differen topic.