为什么C ++模板没有令牌替换(如宏)?

问题描述 投票:-1回答:1

因此,我敢肯定,在某一点或另一点,我们都听到过这样的论点,即宏是有害的,您应该改用模板。不幸的是,我一直遇到问题集,在概念上我可以使用某种模板来根据不同的标记或关键字生成自身,并且想知道以前是否对此主题提出过建议,以及可能出现的任何不可预见的挑战出于这样的设计,因为我正在考虑起草有关此事项的建议的价值。

请考虑以下示例:

struct test { int i; char j; };

template <typename T>
auto get_i(T&& t) { return t._i; }

template <typename T>
auto get_j(T&& t) { return t._j; }

test t{1, 'c'};
auto i = get_i(t);

考虑以下建议的替代方法:

template <token _member, typename T>
auto get_member(T&& t) { return t.@_member; }

test t{1, 'c'};
auto i = get_member<@i>(t);

虽然使用@只是一个占位符,但.token(本着.template的精神)也可能有效(并且在模棱两可的情况下是必需的)。现在,对于实际上(潜在)有用的东西呢?

struct frobnicates_transmogrifies
{
    int frobnicate(){ return 2; }
    double transmogrify(){ return 3.0; }
};

template <typename T>
struct proxy_s
{
    T t;
    template <token _Func, typename... Args>
    auto operator()(Args&&... args)
    {
        std::cout << __PRETTY_FUNCTION__;
        return t.@_Func(std::forward<Args>(args)...);
    }
};

template <token... Tokens, typename T>
auto make_tuple_from_tokens(T&& t)
{
    return std::make_tuple(t.@Tokens...);
}


using frob_tran = frobnicates_transmogrifies;
auto proxy = proxy{frob_tran{}};
std::tuple<int(proxy_s<frob_tran>*)(), double(proxy_s<frob_tran>*)()> t = make_tuple_from_tokens(proxy);

本质上,与宏相反,在具有编译时类型安全性的令牌替换中,似乎至少具有某些价值,并且不必维护多个功能也具有其他好处。由于此提议的语法将是一种模板生成器,因此它将受到与当前模板相同的限制。这样的想法有哪些直接的问题和陷阱?

c++ templates c-preprocessor
1个回答
0
投票

您可以将指向成员的指针作为模板参数来解决。

请注意,模板不是预处理器,它们是编译器完全识别的语言构造。模板的进一步开发不在这个方向上,进一步的是Concepts或Metaclasses提案,它们是高级构造,而不是文本替换。

© www.soinside.com 2019 - 2024. All rights reserved.