Вот отдельный пример использования того, чего я пытаюсь достичь
//Bar.hpp
#ifndef BAR_HPP
#define BAR_HPP
constexpr bool areNamesEqual(const char* name1,const char* name2)
{
return ((*name1 == *name2) && (*name1 == '\0' || areNamesEqual(name1 + 1,name2 + 1)));
}
#endif
Тогда у меня есть класс, который использует эту утилиту сравнения следующим образом
// Foo.hpp
#ifndef FOO_HPP
#define FOO_HPP
#include "Bar.hpp"
class Foo
{
public:
template<typename T_0>
Foo(const T_0 & var_0)
{
static_assert(areNamesEqual(T_0::formatter_name,"Hole"),"Incorrect hole type supplied!");
}
};
#endif
Наконец, у меня есть другой класс, который фактически предоставляет аргумент для сравнения следующим образом
// Hole.hpp
#ifndef HOLE_HPP
#define HOLE_HPP
class Hole {
public:
Hole(double dx) : d(dx) {}
static constexpr const char* formatter_name = "Hole";
private:
double d;
};
#endif
В моем main.cpp, когда я вызываю это, как показано ниже
//main.cpp
#include "Foo.hpp"
#include "Hole.hpp"
int main()
{
Foo f(43);
return 0;
}
g ++ (6.3) с --std = c ++ 14 выдает мне следующую ошибку
In file included from main.cpp:1:0:
Foo.hpp: In instantiation of ‘Foo::Foo(const T_0&) [with T_0 = int]’:
main.cpp:6:13: required from here
Foo.hpp:12:36: error: ‘formatter_name’ is not a member of ‘int’
static_assert(areNamesEqual(T_0::formatter_name,"Hole"),"Incorrect hole type supplied!");
Почему компилятор не может неявно преобразовать тип double
в класс Hole
?
Я не уверен, поможет ли мне здесь оператор преобразования класса Hole.
: UPDATE:
Обновлен фрагмент кода для отображения ошибки для int
literal.