29

Visual Studio 2013 Preview 支持称为(根据页面)“透明运算符函子”的 C++14 功能。我不清楚这意味着什么。我找到的最近的 C++14 提案是这个,但我不确定它是否是同一件事: http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3421

我正在寻找关于它是什么、为什么它是改进的更清晰的解释,也许还有一个展示其用途的片段。

4

1 回答 1

26

透明的算子函子提案是一种拥有位于<functional>. 我个人认为该提案本身有一个很好的例子,可以帮助说明它的必要性。但是,我将继续尝试解释它。

假设您有一个功能,请注意一个非常基本的功能:

template<typename T, typename U>
auto less_than(T&& t, U&& u) -> decltype(std::forward<T>(t) < std::forward<U>(u)) {
    return std::forward<T>(t) < std::forward<U>(u);
}

但是,您想在标题中使用此通用函数。<algorithm>你有两个选择,让它成为一个结构函子:

struct MyLessThanFunctor {
    template<typename T, typename U>
    auto operator()(T&& t, U&& u) -> decltype(std::forward<T>(t) < std::forward<U>(u)){
        return std::forward<T>(t) < std::forward<U>(u);
    }
};

或者在 C++14 中,制作多态 lambda:

[](auto&& t, auto&& u) -> decltype(auto) { 
    return std::forward<decltype(t)>(t) < std::forward<decltype(u)>(u); 
}

当在这样的算法中使用时,两者都非常冗长:

int main() {
    std::vector<int> v = {112,12,1281271,1919101,29181,412,1 };
    std::sort(std::begin(v), std::end(v), MyLessThanFunctor()); // one
    std::sort(std::begin(v), std::end(v), [](auto&& t, auto&& u) -> decltype(auto) { 
        return std::forward<decltype(t)>(t) < std::forward<decltype(u)>(u); 
    });
}

该提案旨在通过这样做来使其更加紧凑和通用:

std::sort(std::begin(v), std::end(v), std::less<>());

这为您提供了完美的转发,并解决了截断问题或因更改容器而不是论文中提到的容器指定的底层类型而引起的问题。

假设你有一个非广义函子:

struct Functor {
    bool operator()(uint32_t a, uint32_t b) {
        return a < b;
    }
};

并且您将它与您一起使用std::vector<uint32_t>并且它工作得很好,但是您忘记了您的仿函数没有被泛化并将它与您的std::vector<uint64_t>. 你能看到出现的问题吗?元素将在比较之前被截断,这可能不是用户想要的。广义函子在它们出现之前为您解决了这个问题。

于 2013-07-19T02:31:18.533 回答