小编Kel*_*áté的帖子

使用概念具有特定值类型的任何容器的 C++ 迭代器

我想摆脱enable_if模板中的所有邪恶s 并用 C++20 概念替换它们,但是几乎没有关于概念的任何信息,并且几乎我阅读的任何来源的语法都发生了变化。

这是一个函数,它接受任何带有MyClass值的容器的两个迭代器:

template <class IteratorType, typename = std::enable_if<std::is_same<
                                typename std::iterator_traits<IteratorType>::value_type,
                                MyClass
                            >::value, void>>
void myFunction( IteratorType begin, IteratorType end ) {}
Run Code Online (Sandbox Code Playgroud)

我知道可以使用概念转换此功能,但我找不到好的线索开始。

c++ sfinae enable-if c++-concepts c++20

11
推荐指数
3
解决办法
514
查看次数

部分特化类的成员定义

我正在尝试定义部分专门化的类模板的成员函数,但是不同的编译器对我可以做什么以及为什么有截然不同的看法。

让我们慢慢来,从适用于所有主要编译器(all = gcc、clang 和 msvc)的东西开始:

#include <concepts>
#include <type_traits>

template <class T>
concept Integer
= std::is_same_v<T,int> || std::is_same_v<T,unsigned int>;

template <class T>
concept FloatingPoint
= std::is_same_v<T,float> || std::is_same_v<T,double>;


template <class T>
struct Foo
{
    T get() {return 0;}
};

template <Integer T>
struct Foo<T>
{
    T get(){ return 0; }
};

template <FloatingPoint T>
struct Foo<T>
{
    T get(){ return 0; }
};

int main()
{
    Foo<char>().get();
    Foo<int>().get();
    Foo<float>().get();
}
Run Code Online (Sandbox Code Playgroud)

Godbolt 上的示例:gccclangmsvc

很酷,但我想将成员函数的声明和定义分开。让我们将定义移到专门的类之一 …

c++ partial-specialization visual-c++ language-lawyer c++-concepts

11
推荐指数
1
解决办法
245
查看次数