5
ProcessIndex( int index );

template< typename Iterator >
void ProcessIndexes( Iterator start, Iterator end )
{
    while( start!=end )
    {
        ProcessIndex(*start++);
    }
}

我怎样才能强制这个函数只能用一个特定的、固定的迭代器值类型来调用,例如int(但任何容器类型)?在这种情况下,ProcessIndex()将 aint作为输入,因此,非原始类型的编译失败并为 eg 生成警告float。但是,我希望声明强制执行int,以便编译失败,但int.

尽管付出了很大的努力,但在这里或其他地方还没有找到“解决方案”,这是微不足道的(?)。

4

2 回答 2

0

从 C++20 开始,您可以使用新概念和requires关键字来检查迭代器是否指向int类型:

#include <vector>

void ProcessIndex( int ) {}

template< typename Iterator >
void ProcessIndecies( Iterator start, Iterator end )
    requires( std::same_as<std::decay_t<decltype(*start)>, int> )
{
    while( start!=end )
    {
        ProcessIndex(*start++);
    }
}

int main() {
    std::vector<int> vi;
    ProcessIndecies(vi.begin(), vi.end()); //ok

    std::vector<float> vf;
    //ProcessIndecies(vf.begin(), vf.end()); //fails
}

演示:https ://gcc.godbolt.org/z/hba1qh8bz

于 2021-12-18T11:07:31.373 回答
0

使用 C++11,您可以使用enable_ifis_samedecay来做到这一点,如下所示:

#include<iostream>
#include <type_traits>
#include <vector>

void ProcessIndex( int index )
{
    //do something here
    std::cout<<"Inside ProcessIndex with: "<< index <<std::endl;
}

template< typename Iterator >
auto ProcessIndexes( Iterator start, Iterator end ) -> typename std::enable_if<std::is_same<typename std::decay<decltype(*start)>::type, int>::value>::type
{
    std::cout<<"Inside ProcessIndexes"<<std::endl;
    while( start!=end )
    {
        ProcessIndex(*start++);
    }
}

int main(){
    std::vector<int> vec{1,2,3};
    ProcessIndexes(vec.begin(), vec.end()); //WORKS

    std::vector<float> vec2;
    //ProcessIndexes(vec2.begin(), vec2.end()); //this won't work
}
于 2021-12-18T12:04:07.280 回答