【问题标题】:Can I access a variable's type for generic programming?我可以访问变量的类型以进行泛型编程吗?
【发布时间】:2016-01-14 02:31:30
【问题描述】:

如果我有如下代码:

std::wstring s(L"...");
bool allCharsEqual = 
        std::find_if(s.begin(), 
                     s.end(), 
                     std::bind1st(std::not_equal_to<std::wstring::value_type>(),
                                  mystring[0]))  // ^^^^^^^^^^^^^^^^^^^^^^^^
        == s.end();

我想在标记的位置有一个通用表达式,如果我将变量类型更改为std::string,它也可以工作。这可能吗?

我意识到我可以把它放在一个额外的函数中并使用字符串类型对其进行模板化,但是还有其他方法吗?

【问题讨论】:

    标签: c++ templates types generic-programming


    【解决方案1】:

    我认为decltype 是您正在寻找的。​​p>

    由于 decltype 仅在 C++11 中可用,如果您必须在 11 之前编写代码,将代码设为模板可能会有所帮助

    template <typename STRING_TYPE> 
    bool allCharsEqual(STRING_TYPE s){
        /* ... */
    }
    

    【讨论】:

      【解决方案2】:

      你可以在 C++11 中使用decltype

      std::not_equal_to<decltype(s)::value_type>()
      

      或者在 C++14 中,您可以使用 transparent comparators 并完全跳过模板参数:

      std::not_equal_to<>()
      

      如果您坚持使用 C++03,您可以创建一个 typedef,这样您就只有一个地方需要更新以更改类型。如果您不能使用 auto 并且您希望更改类型,这通常是一种很好的做法。

      typedef std::wstring str_t
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 2011-12-11
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多